Skip to content

Commit 3ee1567

Browse files
peiyigu-intelintel-mediadev
authored andcommitted
[VP] Fix SR3 Quality Issue
* [VP] Fix SR3 Quality Issue Update model weights bias to fix blur and flick
1 parent daccd8d commit 3ee1567

File tree

11 files changed

+136
-31
lines changed

11 files changed

+136
-31
lines changed

media_softlet/agnostic/common/vp/hal/feature_manager/policy.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,9 @@ MOS_STATUS Policy::RegisterFeatures()
221221
VP_PUBLIC_CHK_NULL_RETURN(p);
222222
m_VeboxSfcFeatureHandlers.emplace(FeatureTypeCgcOnVebox, p);
223223

224+
// FeatureTypeAiOnRender and FeatureTypeAiOnNpu will not be added in sw filter pipe
225+
// They will not be in registeredFeatures
226+
// To get Ai SwFilter, need to use pipe.GetAiSwFilter
224227
p = MOS_New(PolicyAiHandler, m_hwCaps, m_vpInterface.GetGraphManager());
225228
VP_PUBLIC_CHK_NULL_RETURN(p);
226229
m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeAiOnRender, p));

media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -836,6 +836,13 @@ MOS_STATUS SwFilterDenoise::Configure(VP_PIPELINE_PARAMS& params, bool isInputSu
836836
#if !EMUL
837837
GMM_RESOURCE_INFO* pSrcGmmResInfo = surfInput->OsResource.pGmmResInfo;
838838
GMM_RESOURCE_INFO* pTargetGmmResInfo = params.pTarget[0]->OsResource.pGmmResInfo;
839+
if (pTargetGmmResInfo == nullptr &&
840+
params.pTarget[0]->pPipeIntermediateSurface &&
841+
params.pTarget[0]->pPipeIntermediateSurface->osSurface)
842+
{
843+
// For Ai Pipeline, it may use multi pipe, and intermedia surface is in pPipeIntermediateSurface
844+
pTargetGmmResInfo = params.pTarget[0]->pPipeIntermediateSurface->osSurface->OsResource.pGmmResInfo;
845+
}
839846
VP_PUBLIC_CHK_NULL_RETURN(pSrcGmmResInfo);
840847
VP_PUBLIC_CHK_NULL_RETURN(pTargetGmmResInfo);
841848

media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter_handle.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,7 @@ class SwFilterAiBaseHandler : public SwFilterFeatureHandler
301301
virtual ~SwFilterAiBaseHandler();
302302
virtual SwFilter *CreateSwFilter();
303303
virtual MOS_STATUS InitializePipeIntermediateSurface(PVPHAL_SURFACE vphalSurf, bool isNpuShared = false);
304+
virtual MOS_STATUS UpdatePipeIntermediateSurface(PVPHAL_SURFACE vphalSurf);
304305

305306
// This need to be implemented by derived class
306307
virtual bool IsFeatureEnabled(VP_PIPELINE_PARAMS &params, bool isInputPipe, int surfIndex, SwFilterPipeType pipeType) = 0;
@@ -342,6 +343,32 @@ SwFilter *SwFilterAiBaseHandler<SwFilterClassType, Type>::CreateSwFilter()
342343
return swFilter;
343344
}
344345

346+
template <class SwFilterClassType, FeatureType Type>
347+
MOS_STATUS SwFilterAiBaseHandler<SwFilterClassType, Type>::UpdatePipeIntermediateSurface(PVPHAL_SURFACE vphalSurf)
348+
{
349+
VP_PUBLIC_CHK_NULL_RETURN(vphalSurf);
350+
VP_PUBLIC_CHK_NULL_RETURN(vphalSurf->pPipeIntermediateSurface);
351+
PVP_SURFACE surface = vphalSurf->pPipeIntermediateSurface;
352+
353+
surface->ColorSpace = vphalSurf->ColorSpace;
354+
surface->ExtendedGamut = vphalSurf->ExtendedGamut;
355+
surface->Palette = vphalSurf->Palette;
356+
surface->bQueryVariance = vphalSurf->bQueryVariance;
357+
surface->FrameID = vphalSurf->FrameID;
358+
surface->uFwdRefCount = vphalSurf->uFwdRefCount;
359+
surface->uBwdRefCount = vphalSurf->uBwdRefCount;
360+
surface->pFwdRef = vphalSurf->pFwdRef;
361+
surface->pBwdRef = vphalSurf->pBwdRef;
362+
surface->SurfType = vphalSurf->SurfType;
363+
surface->SampleType = vphalSurf->SampleType;
364+
surface->ChromaSiting = vphalSurf->ChromaSiting;
365+
surface->rcSrc = vphalSurf->rcSrc;
366+
surface->rcDst = vphalSurf->rcDst;
367+
surface->rcMaxSrc = vphalSurf->rcMaxSrc;
368+
369+
return MOS_STATUS_SUCCESS;
370+
}
371+
345372
template <class SwFilterClassType, FeatureType Type>
346373
MOS_STATUS SwFilterAiBaseHandler<SwFilterClassType, Type>::InitializePipeIntermediateSurface(PVPHAL_SURFACE vphalSurf, bool isNpuShared)
347374
{

media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter_pipe.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,7 @@ MOS_STATUS SwFilterPipe::Initialize(VP_PIPELINE_PARAMS &params, FeatureRule &fea
296296
}
297297

298298
UpdateSwFilterPipeType();
299+
m_forceToRender = params.bForceToRender;
299300

300301
MOS_STATUS status = ConfigFeatures(params, featureRule);
301302
if (MOS_FAILED(status))

media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter_pipe.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,11 @@ class SwFilterPipe
252252
return m_gpuCtxOnHybridCmd;
253253
}
254254

255+
bool IsForceToRender()
256+
{
257+
return m_forceToRender;
258+
}
259+
255260
protected:
256261
MOS_STATUS CleanFeaturesFromPipe(bool isInputPipe, uint32_t index);
257262
MOS_STATUS CleanFeaturesFromPipe(bool isInputPipe);
@@ -277,6 +282,8 @@ class SwFilterPipe
277282
bool m_processedSecurePrepared = false;
278283
bool m_isExePipe = false;
279284
uint64_t m_gpuCtxOnHybridCmd = 0;
285+
// this only take effect when more than 1 swFilterPipe in vp pipeline, which means each swFilterPipe need its own forceToRender flag
286+
bool m_forceToRender = false;
280287

281288
MEDIA_CLASS_DEFINE_END(vp__SwFilterPipe)
282289
};

media_softlet/agnostic/common/vp/hal/features/vp_ai_filter.cpp

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ MOS_STATUS VpAiFilter::Destroy()
8383
{
8484
for (auto &krnArgHandle : singleLayerKrnArgMapHandle.second)
8585
{
86-
KRN_ARG &krnArg = krnArgHandle.second;
86+
KRN_ARG &krnArg = krnArgHandle.second.krnArg;
8787
MOS_FreeMemAndSetNull(krnArg.pData);
8888
}
8989
singleLayerKrnArgMapHandle.second.clear();
@@ -177,11 +177,11 @@ MOS_STATUS VpAiFilter::InitKrnParams(AI_KERNEL_PARAMS &krnParams, SwFilterPipe &
177177
auto multiLayerKrnArgMapHandle = m_featureAiKrnArgMap.find(ai->GetFeatureType());
178178
if (multiLayerKrnArgMapHandle == m_featureAiKrnArgMap.end())
179179
{
180-
MULTI_LAYERS_KERNEL_INDEX_ARG_MAP multiLayerKrnArgMap = {};
181-
multiLayerKrnArgMapHandle = m_featureAiKrnArgMap.insert(std::make_pair(ai->GetFeatureType(), multiLayerKrnArgMap)).first;
180+
AI_MULTI_LAYERS_KERNEL_INDEX_ARG_MAP multiLayerKrnArgMap = {};
181+
multiLayerKrnArgMapHandle = m_featureAiKrnArgMap.insert(std::make_pair(ai->GetFeatureType(), multiLayerKrnArgMap)).first;
182182
VP_PUBLIC_CHK_NOT_FOUND_RETURN(multiLayerKrnArgMapHandle, &m_featureAiKrnArgMap);
183183
}
184-
MULTI_LAYERS_KERNEL_INDEX_ARG_MAP &multiLayerKrnArgMap = multiLayerKrnArgMapHandle->second;
184+
AI_MULTI_LAYERS_KERNEL_INDEX_ARG_MAP &multiLayerKrnArgMap = multiLayerKrnArgMapHandle->second;
185185

186186
uint32_t startIndex = (swAiParam.stageIndex == 0) ? 0 : ((swAiParam.stageIndex - 1) < swAiParam.splitGroupIndex.size() ? swAiParam.splitGroupIndex.at(swAiParam.stageIndex - 1) : 0);
187187
uint32_t endIndex = swAiParam.stageIndex < swAiParam.splitGroupIndex.size() ? swAiParam.splitGroupIndex.at(swAiParam.stageIndex) : swAiParam.settings.size();
@@ -195,8 +195,8 @@ MOS_STATUS VpAiFilter::InitKrnParams(AI_KERNEL_PARAMS &krnParams, SwFilterPipe &
195195
auto singleLayerKrnArgMapHandle = multiLayerKrnArgMap.find(layerIndex);
196196
if (singleLayerKrnArgMapHandle == multiLayerKrnArgMap.end())
197197
{
198-
KERNEL_INDEX_ARG_MAP singleLayerKrnArgMap = {};
199-
singleLayerKrnArgMapHandle = multiLayerKrnArgMap.insert(std::make_pair(layerIndex, singleLayerKrnArgMap)).first;
198+
AI_KERNEL_INDEX_ARG_MAP singleLayerKrnArgMap = {};
199+
singleLayerKrnArgMapHandle = multiLayerKrnArgMap.insert(std::make_pair(layerIndex, singleLayerKrnArgMap)).first;
200200
VP_PUBLIC_CHK_NOT_FOUND_RETURN(singleLayerKrnArgMapHandle, &multiLayerKrnArgMap);
201201
}
202202
if (layerIndex >= swAiParam.settings.size())
@@ -221,55 +221,70 @@ MOS_STATUS VpAiFilter::InitKrnParams(AI_KERNEL_PARAMS &krnParams, SwFilterPipe &
221221
KERNEL_BTIS kernelBtis = handle->second.GetKernelBtis();
222222
KERNEL_ARGS kernelArgs = handle->second.GetKernelArgs();
223223

224-
KERNEL_INDEX_ARG_MAP &singleLayerKrnArgMap = singleLayerKrnArgMapHandle->second;
224+
AI_KERNEL_INDEX_ARG_MAP &singleLayerKrnArgMap = singleLayerKrnArgMapHandle->second;
225225

226226
for (auto const &kernelArg : kernelArgs)
227227
{
228228
uint32_t argIndex = kernelArg.uIndex;
229229
auto krnArgHandle = singleLayerKrnArgMap.find(argIndex);
230230
if (krnArgHandle == singleLayerKrnArgMap.end())
231231
{
232-
KRN_ARG krnArg = {};
233-
krnArgHandle = singleLayerKrnArgMap.insert(std::make_pair(argIndex, krnArg)).first;
232+
AI_KRN_ARG krnArg = {};
233+
krnArgHandle = singleLayerKrnArgMap.insert(std::make_pair(argIndex, krnArg)).first;
234234
VP_PUBLIC_CHK_NOT_FOUND_RETURN(krnArgHandle, &singleLayerKrnArgMap);
235235
}
236-
KRN_ARG &krnArg = krnArgHandle->second;
237-
krnArg.uIndex = kernelArg.uIndex;
238-
krnArg.eArgKind = kernelArg.eArgKind;
239-
krnArg.uSize = kernelArg.uSize;
240-
krnArg.addressMode = kernelArg.addressMode;
241-
bool bInit = true;
236+
AI_KRN_ARG &aiKrnArg = krnArgHandle->second;
237+
KRN_ARG &krnArg = aiKrnArg.krnArg;
238+
krnArg.uIndex = kernelArg.uIndex;
239+
krnArg.eArgKind = kernelArg.eArgKind;
240+
krnArg.uSize = kernelArg.uSize;
241+
krnArg.addressMode = kernelArg.addressMode;
242+
bool bInit = true;
242243

243244
if (kernelArg.addressMode == AddressingModeStateless)
244245
{
245-
if (krnArg.pData == nullptr)
246+
if (krnArg.pData != nullptr)
246247
{
247-
krnArg.uSize = kernelArg.uSize;
248-
krnArg.pData = MOS_AllocAndZeroMemory(sizeof(SURFACE_PARAMS));
249-
VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
248+
if (aiKrnArg.reservedSize != sizeof(SURFACE_PARAMS))
249+
{
250+
aiKrnArg.reservedSize = 0;
251+
MOS_FreeMemAndSetNull(krnArg.pData);
252+
}
253+
else
254+
{
255+
MOS_ZeroMemory(krnArg.pData, aiKrnArg.reservedSize);
256+
}
250257
}
251-
else
258+
259+
if (krnArg.pData == nullptr)
252260
{
253-
MOS_ZeroMemory(krnArg.pData, sizeof(SURFACE_PARAMS));
261+
aiKrnArg.reservedSize = sizeof(SURFACE_PARAMS);
262+
krnArg.pData = MOS_AllocAndZeroMemory(aiKrnArg.reservedSize);
263+
VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
254264
}
255265
VP_PUBLIC_CHK_NULL_RETURN(singleLayerSetting.pfnSetStatelessSurface);
256266
VP_PUBLIC_CHK_STATUS_RETURN(singleLayerSetting.pfnSetStatelessSurface(kernelArg.uIndex, executingPipe, *(PSURFACE_PARAMS)krnArg.pData, bInit));
257267
}
258268
else
259-
{
260-
if (krnArg.pData == nullptr)
269+
{
270+
if (krnArg.pData != nullptr)
261271
{
262-
if (kernelArg.uSize > 0)
272+
if (aiKrnArg.reservedSize != kernelArg.uSize)
263273
{
264-
krnArg.uSize = kernelArg.uSize;
265-
krnArg.pData = MOS_AllocAndZeroMemory(kernelArg.uSize);
266-
VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
274+
aiKrnArg.reservedSize = 0;
275+
MOS_FreeMemAndSetNull(krnArg.pData);
276+
}
277+
else
278+
{
279+
MOS_ZeroMemory(krnArg.pData, aiKrnArg.reservedSize);
267280
}
268281
}
269-
else
282+
283+
if (krnArg.pData == nullptr && kernelArg.uSize > 0)
270284
{
271-
VP_PUBLIC_CHK_VALUE_RETURN(krnArg.uSize, kernelArg.uSize);
272-
MOS_ZeroMemory(krnArg.pData, krnArg.uSize);
285+
aiKrnArg.reservedSize = kernelArg.uSize;
286+
krnArg.pData = MOS_AllocAndZeroMemory(kernelArg.uSize);
287+
VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
273288
}
274289
VP_PUBLIC_CHK_NULL_RETURN(singleLayerSetting.pfnSetKernelArg);
275290
VP_PUBLIC_CHK_STATUS_RETURN(singleLayerSetting.pfnSetKernelArg(kernelArg.uIndex, executingPipe, krnArg.pData, bInit));

media_softlet/agnostic/common/vp/hal/features/vp_ai_filter.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,14 @@ class VpAiFilter : public VpFilter
6464
}
6565

6666
private:
67-
using FEATURE_AI_KERNEL_ARG_MAP = std::map<FeatureType, MULTI_LAYERS_KERNEL_INDEX_ARG_MAP>;
67+
struct AI_KRN_ARG
68+
{
69+
KRN_ARG krnArg = {};
70+
uint32_t reservedSize = 0;
71+
};
72+
using AI_KERNEL_INDEX_ARG_MAP = std::map<uint32_t,AI_KRN_ARG>;
73+
using AI_MULTI_LAYERS_KERNEL_INDEX_ARG_MAP = std::map<uint32_t,AI_KERNEL_INDEX_ARG_MAP>;
74+
using FEATURE_AI_KERNEL_ARG_MAP = std::map<FeatureType, AI_MULTI_LAYERS_KERNEL_INDEX_ARG_MAP>;
6875

6976
MOS_STATUS SetConfig(SwFilterPipe &executingPipe, AI_KERNEL_CONFIG &config);
7077
MOS_STATUS InitKrnParams(AI_KERNEL_PARAMS &krnParams, SwFilterPipe &executingPipe);

media_softlet/agnostic/common/vp/hal/pipeline/vp_packet_reuse_manager.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,15 @@ MOS_STATUS VpPacketReuseManager::PreparePacketPipeReuse(SwFilterPipe *&swFilterP
663663
auto featureRegistered = policy.GetFeatureRegistered();
664664

665665
isPacketPipeReused = true;
666+
667+
bool hasAiSwFilter = false;
668+
VP_PUBLIC_CHK_STATUS_RETURN(pipe.QuerySwAiFilter(hasAiSwFilter));
669+
if (hasAiSwFilter)
670+
{
671+
m_reusable = false;
672+
isPacketPipeReused = false;
673+
VP_PUBLIC_NORMALMESSAGE("Packet not reused for containing AI feature");
674+
}
666675

667676
for (auto feature : featureRegistered)
668677
{

media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,10 @@ MOS_STATUS VpPipeline::ExecuteVpPipeline()
622622
VP_PUBLIC_CHK_NULL_RETURN(singlePipeCtx->GetVpResourceManager());
623623
VP_PUBLIC_CHK_STATUS_RETURN(m_vpInterface->SwitchResourceManager(singlePipeCtx->GetVpResourceManager()));
624624

625+
// For multi swFilterPipe cases, it may need to udpate userFeatureControl pipe by pipe
626+
VP_PUBLIC_CHK_NULL_RETURN(m_userFeatureControl);
627+
m_userFeatureControl->UpdateOnNewPipe(pipe, swFilterPipes.size());
628+
625629
VP_PUBLIC_CHK_STATUS_RETURN(ExecuteSingleswFilterPipe(singlePipeCtx, pipe, pPacketPipe, featureManagerNext));
626630
// FrameCounter will be increased inside ExecuteSingleswFilterPipe, so m_vpPipeContexts[pipeIdx]->GetFrameCounter() - 1 is needed.
627631
MT_LOG2(MT_VP_FEATURE_GRAPH_EXECUTE_SINGLE_VPPIPELINE_END, MT_NORMAL,

media_softlet/agnostic/common/vp/hal/utils/vp_user_feature_control.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,29 @@ MOS_STATUS VpUserFeatureControl::CreateUserSettingForDebug()
508508
return MOS_STATUS_SUCCESS;
509509
}
510510

511+
MOS_STATUS VpUserFeatureControl::UpdateOnNewPipe(SwFilterPipe *swFilterPipe, uint32_t pipeCnt)
512+
{
513+
VP_PUBLIC_CHK_NULL_RETURN(swFilterPipe);
514+
515+
// if more than one swFilterPipe, then update the swFilterPipe config
516+
if (pipeCnt > 1)
517+
{
518+
if (swFilterPipe->IsForceToRender())
519+
{
520+
m_ctrlVal.disableSfc = true;
521+
m_ctrlVal.disableVeboxOutput = true;
522+
VP_PUBLIC_NORMALMESSAGE("Disable SFC and vebox output as task is forced to render.");
523+
}
524+
else
525+
{
526+
m_ctrlVal.disableSfc = false;
527+
m_ctrlVal.disableVeboxOutput = false;
528+
}
529+
}
530+
531+
return MOS_STATUS_SUCCESS;
532+
}
533+
511534
MOS_STATUS VpUserFeatureControl::Update(PVP_PIPELINE_PARAMS params)
512535
{
513536
VP_PUBLIC_CHK_NULL_RETURN(params);

0 commit comments

Comments
 (0)