diff --git a/media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter_pipe.h b/media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter_pipe.h index 36a1c95923..e6e2c541c7 100644 --- a/media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter_pipe.h +++ b/media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter_pipe.h @@ -44,6 +44,7 @@ namespace vp #define MAX_LAYER_COUNT VPHAL_MAX_SOURCES class VpInterface; +class VpPipelineParamFactory; struct FeatureSet { diff --git a/media_softlet/agnostic/common/vp/hal/feature_manager/vp_obj_factories.cpp b/media_softlet/agnostic/common/vp/hal/feature_manager/vp_obj_factories.cpp index cce064c359..0649dcea81 100644 --- a/media_softlet/agnostic/common/vp/hal/feature_manager/vp_obj_factories.cpp +++ b/media_softlet/agnostic/common/vp/hal/feature_manager/vp_obj_factories.cpp @@ -25,7 +25,6 @@ //! \brief Factories for vp object creation. //! #include "vp_obj_factories.h" -#include "vp_pipeline.h" #include "sw_filter_handle.h" using namespace vp; @@ -218,11 +217,12 @@ MOS_STATUS SwFilterPipeFactory::Update(VP_PIPELINE_PARAMS ¶ms, int index) return MOS_STATUS_SUCCESS; } -MOS_STATUS SwFilterPipeFactory::Create(PVP_PIPELINE_PARAMS params, std::vector &swFilterPipe) +MOS_STATUS SwFilterPipeFactory::Create(PVP_PIPELINE_PARAMS params, std::vector &swFilterPipe, VpPipelineParamFactory *pipelineParamFactory) { VP_FUNC_CALL(); VP_PUBLIC_CHK_NULL_RETURN(params); + VP_PUBLIC_CHK_NULL_RETURN(pipelineParamFactory); int pipeCnt = GetPipeCountForProcessing(*params); if (pipeCnt == 0) { @@ -233,14 +233,17 @@ MOS_STATUS SwFilterPipeFactory::Create(PVP_PIPELINE_PARAMS params, std::vectorClone(params); + VP_PUBLIC_CHK_NULL_RETURN(tempParams); + VP_PUBLIC_CHK_STATUS_RETURN(Update(*tempParams, index)); SwFilterPipe *pipe = m_allocator.Create(); VP_PUBLIC_CHK_NULL_RETURN(pipe); FeatureRule featureRule; - MOS_STATUS status = pipe->Initialize(tempParams, featureRule); + MOS_STATUS status = pipe->Initialize(*tempParams, featureRule); + + VP_PUBLIC_CHK_STATUS_RETURN(pipelineParamFactory->Destroy(tempParams)); if (MOS_FAILED(status)) { diff --git a/media_softlet/agnostic/common/vp/hal/feature_manager/vp_obj_factories.h b/media_softlet/agnostic/common/vp/hal/feature_manager/vp_obj_factories.h index f6eaaf8291..2c91c8e0f7 100644 --- a/media_softlet/agnostic/common/vp/hal/feature_manager/vp_obj_factories.h +++ b/media_softlet/agnostic/common/vp/hal/feature_manager/vp_obj_factories.h @@ -134,7 +134,7 @@ class SwFilterPipeFactory SwFilterPipeFactory(VpInterface &vpInterface); virtual ~SwFilterPipeFactory(); - MOS_STATUS Create(PVP_PIPELINE_PARAMS params, std::vector &swFilterPipe); + MOS_STATUS Create(PVP_PIPELINE_PARAMS params, std::vector &swFilterPipe, VpPipelineParamFactory *pipelineParamFactory); MOS_STATUS Create(VEBOX_SFC_PARAMS *params, std::vector &swFilterPipe); // Create empty swFilter diff --git a/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.cpp b/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.cpp index fb711fe77c..c32afdca80 100644 --- a/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.cpp +++ b/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.cpp @@ -99,6 +99,10 @@ VpPipeline::~VpPipeline() MOS_Delete(m_userFeatureControl); m_vpMhwInterface.m_userFeatureControl = nullptr; } + if (m_pipelineParamFactory) + { + MOS_Delete(m_pipelineParamFactory); + } } MOS_STATUS VpPipeline::GetStatusReport(void *status, uint16_t numStatus) @@ -594,11 +598,10 @@ MOS_STATUS VpPipeline::UpdateExecuteStatus(uint32_t frameCnt) MOS_STATUS VpPipeline::CreateSwFilterPipe(VP_PARAMS ¶ms, std::vector &swFilterPipe) { VP_FUNC_CALL(); - switch (m_pvpParams.type) { case PIPELINE_PARAM_TYPE_LEGACY: - VP_PUBLIC_CHK_STATUS_RETURN(m_vpInterface->GetSwFilterPipeFactory().Create(m_pvpParams.renderParams, swFilterPipe)); + VP_PUBLIC_CHK_STATUS_RETURN(m_vpInterface->GetSwFilterPipeFactory().Create(m_pvpParams.renderParams, swFilterPipe, m_pipelineParamFactory)); break; case PIPELINE_PARAM_TYPE_MEDIA_SFC_INTERFACE: VP_PUBLIC_CHK_STATUS_RETURN(m_vpInterface->GetSwFilterPipeFactory().Create(m_pvpParams.sfcParams, swFilterPipe)); @@ -742,6 +745,9 @@ MOS_STATUS VpPipeline::CreateFeatureManager(VpResourceManager *vpResourceManager VP_PUBLIC_CHK_STATUS_RETURN(((VpFeatureManagerNext *)m_featureManager)->Init(nullptr)); + m_pipelineParamFactory = MOS_New(VpPipelineParamFactory); + VP_PUBLIC_CHK_NULL_RETURN(m_pipelineParamFactory); + return MOS_STATUS_SUCCESS; } diff --git a/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.h b/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.h index e7bc1a7919..0c368c6775 100644 --- a/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.h +++ b/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.h @@ -66,6 +66,57 @@ struct VP_PARAMS }; }; +class VpPipelineParamFactory +{ +public: + VpPipelineParamFactory(){}; + virtual ~VpPipelineParamFactory() + { + while (!m_Pool.empty()) + { + PVP_PIPELINE_PARAMS param = m_Pool.back(); + m_Pool.pop_back(); + MOS_Delete(param); + } + } + + virtual PVP_PIPELINE_PARAMS Clone(PVP_PIPELINE_PARAMS param) + { + PVP_PIPELINE_PARAMS paramDst = nullptr; + + if (m_Pool.empty()) + { + paramDst = MOS_New(VP_PIPELINE_PARAMS); + *paramDst = *param; + } + else + { + paramDst = m_Pool.back(); + if (paramDst) + { + m_Pool.pop_back(); + *paramDst = *param; + } + } + return paramDst; + } + + virtual MOS_STATUS Destroy(PVP_PIPELINE_PARAMS ¶m) + { + if (param == nullptr) + { + return MOS_STATUS_SUCCESS; + } + m_Pool.push_back(param); + param = nullptr; + return MOS_STATUS_SUCCESS; + } + + std::vector m_Pool; + +MEDIA_CLASS_DEFINE_END(vp__VpPipelineParamFactory) +}; + class VpPipeline : public MediaPipeline { public: @@ -415,6 +466,7 @@ class VpPipeline : public MediaPipeline VP_SETTINGS *m_vpSettings = nullptr; VpUserFeatureControl *m_userFeatureControl = nullptr; std::vector m_vpPipeContexts = {}; + VpPipelineParamFactory *m_pipelineParamFactory = nullptr; MEDIA_CLASS_DEFINE_END(vp__VpPipeline) };