New Upstream Release - intel-media-driver

Ready changes

Summary

Merged new upstream version: 23.1.3+dfsg1 (was: 23.1.2+dfsg1).

Diff

diff --git a/CMakeLists.txt b/CMakeLists.txt
index a70cba3d..5d57a9cd 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -21,7 +21,7 @@
 cmake_minimum_required(VERSION 3.5)
 project(IntelMediaDriver)
 
-set(MEDIA_VERSION "23.1.2${MEDIA_VERSION_EXTRA}" CACHE STRING "" FORCE)
+set(MEDIA_VERSION "23.1.3${MEDIA_VERSION_EXTRA}" CACHE STRING "" FORCE)
 
 include(os_release_info.cmake)
 
diff --git a/debian/changelog b/debian/changelog
index fbc564b4..1c47ea1b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+intel-media-driver (23.1.3+dfsg1-1) UNRELEASED; urgency=low
+
+  * New upstream release.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Sun, 12 Mar 2023 10:54:53 -0000
+
 intel-media-driver (23.1.2+dfsg1-1) unstable; urgency=medium
 
   * New upstream version 23.1.2+dfsg1
diff --git a/debian/patches/0001-Integrate-unit-tests-in-cmake-s-test-framework.patch b/debian/patches/0001-Integrate-unit-tests-in-cmake-s-test-framework.patch
index 70479f22..e098358b 100644
--- a/debian/patches/0001-Integrate-unit-tests-in-cmake-s-test-framework.patch
+++ b/debian/patches/0001-Integrate-unit-tests-in-cmake-s-test-framework.patch
@@ -8,10 +8,10 @@ Subject: Integrate unit tests in cmake's test framework
  media_driver/linux/ult/ult_app/CMakeLists.txt | 12 ++++--------
  3 files changed, 5 insertions(+), 15 deletions(-)
 
-diff --git a/CMakeLists.txt b/CMakeLists.txt
-index 5a11b6f..2c75524 100755
---- a/CMakeLists.txt
-+++ b/CMakeLists.txt
+Index: intel-media-driver.git/CMakeLists.txt
+===================================================================
+--- intel-media-driver.git.orig/CMakeLists.txt
++++ intel-media-driver.git/CMakeLists.txt
 @@ -78,6 +78,7 @@ if (BUILD_KERNELS)
      add_subdirectory(Tools/MediaDriverTools)
  endif()
@@ -20,10 +20,10 @@ index 5a11b6f..2c75524 100755
  add_subdirectory(media_driver)
  
  if("${LIBVA_DRIVERS_PATH}" STREQUAL "")
-diff --git a/media_driver/linux/ult/CMakeLists.txt b/media_driver/linux/ult/CMakeLists.txt
-index 9fb5b39..4f54575 100644
---- a/media_driver/linux/ult/CMakeLists.txt
-+++ b/media_driver/linux/ult/CMakeLists.txt
+Index: intel-media-driver.git/media_driver/linux/ult/CMakeLists.txt
+===================================================================
+--- intel-media-driver.git.orig/media_driver/linux/ult/CMakeLists.txt
++++ intel-media-driver.git/media_driver/linux/ult/CMakeLists.txt
 @@ -51,10 +51,3 @@ endif ()
  
  add_subdirectory(libdrm_mock)
@@ -35,11 +35,11 @@ index 9fb5b39..4f54575 100644
 -    PROPERTIES PASS_REGULAR_EXPRESSION "PASS")
 -set_tests_properties(test_devult
 -    PROPERTIES FAIL_REGULAR_EXPRESSION "FAIL")
-diff --git a/media_driver/linux/ult/ult_app/CMakeLists.txt b/media_driver/linux/ult/ult_app/CMakeLists.txt
-index b4c54b6..7a05725 100644
---- a/media_driver/linux/ult/ult_app/CMakeLists.txt
-+++ b/media_driver/linux/ult/ult_app/CMakeLists.txt
-@@ -75,13 +75,9 @@ if (DEFINED BYPASS_MEDIA_ULT AND "${BYPASS_MEDIA_ULT}" STREQUAL "yes")
+Index: intel-media-driver.git/media_driver/linux/ult/ult_app/CMakeLists.txt
+===================================================================
+--- intel-media-driver.git.orig/media_driver/linux/ult/ult_app/CMakeLists.txt
++++ intel-media-driver.git/media_driver/linux/ult/ult_app/CMakeLists.txt
+@@ -75,13 +75,9 @@ if (DEFINED BYPASS_MEDIA_ULT AND "${BYPA
      message("-- media -- BYPASS_MEDIA_ULT = ${BYPASS_MEDIA_ULT}")
  else ()
      if (ENABLE_NONFREE_KERNELS)
diff --git a/debian/patches/0002-Remove-settings-based-on-ARCH.patch b/debian/patches/0002-Remove-settings-based-on-ARCH.patch
index 1bb9595a..aa3b925e 100644
--- a/debian/patches/0002-Remove-settings-based-on-ARCH.patch
+++ b/debian/patches/0002-Remove-settings-based-on-ARCH.patch
@@ -6,10 +6,10 @@ Subject: Remove settings based on ARCH
  media_driver/cmake/linux/media_compile_flags_linux.cmake | 11 -----------
  1 file changed, 11 deletions(-)
 
-diff --git a/media_driver/cmake/linux/media_compile_flags_linux.cmake b/media_driver/cmake/linux/media_compile_flags_linux.cmake
-index 04729a2..a7d386b 100755
---- a/media_driver/cmake/linux/media_compile_flags_linux.cmake
-+++ b/media_driver/cmake/linux/media_compile_flags_linux.cmake
+Index: intel-media-driver.git/media_driver/cmake/linux/media_compile_flags_linux.cmake
+===================================================================
+--- intel-media-driver.git.orig/media_driver/cmake/linux/media_compile_flags_linux.cmake
++++ intel-media-driver.git/media_driver/cmake/linux/media_compile_flags_linux.cmake
 @@ -51,9 +51,6 @@ set(MEDIA_COMPILER_FLAGS_COMMON
      -ffunction-sections
      -Wl,--gc-sections
diff --git a/media_common/agnostic/common/media_interfaces/media_interfaces_vphal.h b/media_common/agnostic/common/media_interfaces/media_interfaces_vphal.h
index 980bb35c..17522e43 100644
--- a/media_common/agnostic/common/media_interfaces/media_interfaces_vphal.h
+++ b/media_common/agnostic/common/media_interfaces/media_interfaces_vphal.h
@@ -84,7 +84,8 @@ public:
     static VpBase *CreateFactoryNext(
         PMOS_INTERFACE     osInterface,
         MOS_CONTEXT_HANDLE osDriverContext,
-        MOS_STATUS         *eStatus);
+        MOS_STATUS         *eStatus,
+        bool               clearViewMode = false);
 
     static MOS_STATUS CreateVPMhwInterfaces(
         bool                             sfcNeeded,
@@ -108,7 +109,8 @@ public:
     virtual MOS_STATUS Initialize(
         PMOS_INTERFACE  osInterface,
         bool            bInitVphalState,
-        MOS_STATUS      *eStatus) = 0;
+        MOS_STATUS      *eStatus,
+        bool            clearViewMode = false) = 0;
 
     virtual MOS_STATUS CreateVpPlatformInterface(
         PMOS_INTERFACE osInterface,
diff --git a/media_common/agnostic/common/os/mos_os.h b/media_common/agnostic/common/os/mos_os.h
index 5284335c..9f81bd0c 100644
--- a/media_common/agnostic/common/os/mos_os.h
+++ b/media_common/agnostic/common/os/mos_os.h
@@ -658,6 +658,13 @@ typedef void *              MOS_INTERFACE_HANDLE;
 
 class GpuContextMgr;
 
+namespace CMRT_UMD
+{
+    class CmDevice;
+};
+struct _CM_HAL_STATE;
+typedef struct _CM_HAL_STATE *PCM_HAL_STATE;
+
 //!
 //! \brief Structure to Unified HAL OS resources
 //!
@@ -758,7 +765,6 @@ typedef struct _MOS_INTERFACE
 #endif
 
     bool                            bEnableVdboxBalancing;                            //!< Enable per BB VDBox balancing
-
 #if (_DEBUG || _RELEASE_INTERNAL)
     int                             eForceVdbox;                                  //!< Force select Vdbox
     uint32_t                        dwForceTileYfYs;                              // force to allocate Yf (=1) or Ys (=2), remove after full validation
@@ -1526,6 +1532,54 @@ typedef struct _MOS_INTERFACE
     MOS_STATUS (*pfnDestroyVeInterface)(
         PMOS_VIRTUALENGINE_INTERFACE *veInterface);
 
+    //!
+    //! \brief    Creates a CmDevice from a MOS context.
+    //! \details  If an existing CmDevice has already associated to the MOS context,
+    //!           the existing CmDevice will be returned. Otherwise, a new CmDevice
+    //!           instance will be created and associatied with that MOS context.
+    //! \param    mosContext
+    //!           [in] pointer to MOS conetext.
+    //! \param    device
+    //!           [in,out] reference to the pointer to the CmDevice.
+    //! \param    devCreateOption
+    //!           [in] option to customize CmDevice.
+    //! \return   int32_t
+    //!           CM_SUCCESS if the CmDevice is successfully created.
+    //!           CM_NULL_POINTER if pMosContext is null.
+    //!           CM_FAILURE otherwise.
+    //!
+    int32_t (*pfnCreateCmDevice)(
+        MOS_CONTEXT             *mosContext,
+        CMRT_UMD::CmDevice      *&device,
+        uint32_t                devCreateOption,
+        uint8_t                 priority);
+
+    //!
+    //! \brief    Destroys the CmDevice. 
+    //! \details  This function also destroys surfaces, kernels, programs, samplers,
+    //!           threadspaces, tasks and the queues that were created using this
+    //!           device instance but haven't explicitly been destroyed by calling
+    //!           respective destroy functions. 
+    //! \param    device
+    //!           [in] reference to the pointer to the CmDevice.
+    //! \return   int32_t
+    //!           CM_SUCCESS if CmDevice is successfully destroyed.
+    //!           CM_FAILURE otherwise.
+    //!
+    int32_t (*pfnDestroyCmDevice)(
+        CMRT_UMD::CmDevice      *&device);
+
+    //!
+    //! \brief    Initialize cm hal ddi interfaces
+    //! \details  Initialize cm hal ddi interfaces
+    //! \param    cmState
+    //!           [in,out] the pointer to the cm state.
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if succeeded, otherwise error code
+    //!
+    MOS_STATUS (*pfnInitCmInterface)(
+        PCM_HAL_STATE           cmState);
+
 #if (_DEBUG || _RELEASE_INTERNAL)
     //!
     //! \brief    gpuCtxCreateOption Init for media Scalability
diff --git a/media_common/agnostic/common/os/mos_os_trace_event.h b/media_common/agnostic/common/os/mos_os_trace_event.h
index 86927ee1..84d67796 100644
--- a/media_common/agnostic/common/os/mos_os_trace_event.h
+++ b/media_common/agnostic/common/os/mos_os_trace_event.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2015-2017, Intel Corporation
+* Copyright (c) 2015-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -562,6 +562,7 @@ typedef enum _MT_LOG_ID
     MT_CP_HAL_STATUS_CHECK,
     MT_CP_PROVISION_CERT_CHECK,
     MT_CP_PROVISION_CERT_NOT_FOUND,
+    MT_CP_HUC_NOT_AUTHENTICATED,
     MT_CP_KERNEL_RULE,
     MT_CP_KERNEL_TRANSCRYPT,
     MT_CP_BUFFER_RULE,
diff --git a/media_common/agnostic/common/vp/hal/vp_common.h b/media_common/agnostic/common/vp/hal/vp_common.h
index ce20c127..cc11c251 100644
--- a/media_common/agnostic/common/vp/hal/vp_common.h
+++ b/media_common/agnostic/common/vp/hal/vp_common.h
@@ -169,6 +169,9 @@ struct VPHAL_SURFACE
     MOS_RESOURCE_MMC_MODE CompressionMode   = MOS_MMC_DISABLED;
     uint32_t              CompressionFormat = 0;
 
+    //Surface cache Usage
+    uint32_t CacheSetting = 0;
+
     bool bUseSampleUnorm    = false;  //!<  true: sample unorm is used, false: DScaler or AVS is used.
     bool bUseSamplerLumakey = false;  //!<  true: sampler lumakey is used, false: lumakey is disabled or EU computed lumakey is used.
     //------------------------------------------
diff --git a/media_common/agnostic/common/vp/hal/vp_common_tools.h b/media_common/agnostic/common/vp/hal/vp_common_tools.h
index 37c45041..65a81459 100644
--- a/media_common/agnostic/common/vp/hal/vp_common_tools.h
+++ b/media_common/agnostic/common/vp/hal/vp_common_tools.h
@@ -125,6 +125,8 @@ typedef struct _VP_CONFIG
     uint32_t   dwRTCompressibleReported;   // RT MMC Reported compressible flag
     uint32_t   dwRTCompressMode;           // RT MMC Compression Mode
     uint32_t   dwRTCompressModeReported;   // RT MMC Reported Compression Mode
+    uint32_t   dwRTCacheSetting;          // RT cache usage
+    uint32_t   dwRTCacheSettingReported;  // RT cache Reported usage
     uint32_t   dwFFDICompressible;         // FFDI Compressible flag
     uint32_t   dwFFDICompressMode;         // FFDI Compression mode
     uint32_t   dwFFDNCompressible;         // FFDN Compressible flag
diff --git a/media_common/linux/common/os/mos_os_specific.h b/media_common/linux/common/os/mos_os_specific.h
index ee48a207..8190bda2 100644
--- a/media_common/linux/common/os/mos_os_specific.h
+++ b/media_common/linux/common/os/mos_os_specific.h
@@ -375,6 +375,8 @@ struct MOS_SURFACE
     bool                bGMMTileEnabled;                                        //!< [out] GMM defined tile mode flag
     uint32_t            YoffsetForUplane;                                       //!< [out] Y offset from U plane to Y plane.
     uint32_t            YoffsetForVplane;                                       //!< [out] Y offset from V plane to Y plane.
+    // Surface cache Usage
+    uint32_t CacheSetting;
 };
 typedef MOS_SURFACE *PMOS_SURFACE;
 
diff --git a/media_driver/agnostic/Xe_M/Xe_HPM/codec/hal/codechal_kernel_olp_mdf_xe_hpm.cpp b/media_driver/agnostic/Xe_M/Xe_HPM/codec/hal/codechal_kernel_olp_mdf_xe_hpm.cpp
index 0ab2f53b..6a508c71 100644
--- a/media_driver/agnostic/Xe_M/Xe_HPM/codec/hal/codechal_kernel_olp_mdf_xe_hpm.cpp
+++ b/media_driver/agnostic/Xe_M/Xe_HPM/codec/hal/codechal_kernel_olp_mdf_xe_hpm.cpp
@@ -35,7 +35,7 @@ MOS_STATUS CodechalKernelOlpMdfXe_Hpm::Init(PMOS_INTERFACE osInterface)
 {
     CODECHAL_DECODE_FUNCTION_ENTER;
     CODECHAL_DECODE_CHK_NULL_RETURN(osInterface);
-
+    m_osInterface = osInterface;
     if (m_cmDevice)
     {
         return MOS_STATUS_SUCCESS;
@@ -44,10 +44,11 @@ MOS_STATUS CodechalKernelOlpMdfXe_Hpm::Init(PMOS_INTERFACE osInterface)
     osInterface->pfnNotifyStreamIndexSharing(osInterface);
 
     uint32_t devCreateOption = CM_DEVICE_CREATE_OPTION_SCRATCH_SPACE_DISABLE;
-    CODECHAL_DECODE_CHK_STATUS_RETURN(CreateCmDevice(
+    CODECHAL_DECODE_CHK_STATUS_RETURN(osInterface->pfnCreateCmDevice(
         osInterface->pOsContext,
         m_cmDevice,
-        devCreateOption));
+        devCreateOption,
+        CM_DEVICE_CREATE_PRIORITY_DEFAULT));
 
     CODECHAL_DECODE_CHK_STATUS_RETURN(m_cmDevice->CreateQueue(m_cmQueue));
 #if defined(ENABLE_KERNELS) && !defined(_FULL_OPEN_SOURCE)
diff --git a/media_driver/agnostic/Xe_M/Xe_XPM/codec/hal/codechal_kernel_olp_mdf_xe_xpm.cpp b/media_driver/agnostic/Xe_M/Xe_XPM/codec/hal/codechal_kernel_olp_mdf_xe_xpm.cpp
index fd8801c1..69a850e0 100644
--- a/media_driver/agnostic/Xe_M/Xe_XPM/codec/hal/codechal_kernel_olp_mdf_xe_xpm.cpp
+++ b/media_driver/agnostic/Xe_M/Xe_XPM/codec/hal/codechal_kernel_olp_mdf_xe_xpm.cpp
@@ -35,7 +35,7 @@ MOS_STATUS CodechalKernelOlpMdf::Init(PMOS_INTERFACE osInterface)
 {
     CODECHAL_DECODE_FUNCTION_ENTER;
     CODECHAL_DECODE_CHK_NULL_RETURN(osInterface);
-
+    m_osInterface = osInterface;
     if (m_cmDevice)
     {
         return MOS_STATUS_SUCCESS;
@@ -44,10 +44,11 @@ MOS_STATUS CodechalKernelOlpMdf::Init(PMOS_INTERFACE osInterface)
     osInterface->pfnNotifyStreamIndexSharing(osInterface);
 
     uint32_t devCreateOption = CM_DEVICE_CREATE_OPTION_SCRATCH_SPACE_DISABLE;
-    CODECHAL_DECODE_CHK_STATUS_RETURN(CreateCmDevice(
+    CODECHAL_DECODE_CHK_STATUS_RETURN(osInterface->pfnCreateCmDevice(
         osInterface->pOsContext,
         m_cmDevice,
-        devCreateOption));
+        devCreateOption,
+        CM_DEVICE_CREATE_PRIORITY_DEFAULT));
 
     CODECHAL_DECODE_CHK_STATUS_RETURN(m_cmDevice->CreateQueue(m_cmQueue));
 #if defined(ENABLE_KERNELS) && !defined(_FULL_OPEN_SOURCE)
@@ -215,7 +216,10 @@ MOS_STATUS CodechalKernelOlpMdf::UnInit()
         m_cmDevice->DestroyProgram(m_cmProgram);
         m_cmProgram = nullptr;
     }
-    DestroyCmDevice(m_cmDevice);
+    if (m_osInterface != nullptr)
+    {
+        m_osInterface->pfnDestroyCmDevice(m_cmDevice);
+    }
 
     return MOS_STATUS_SUCCESS;
 }
diff --git a/media_driver/agnostic/Xe_M/Xe_XPM/codec/hal/codechal_kernel_olp_mdf_xe_xpm.h b/media_driver/agnostic/Xe_M/Xe_XPM/codec/hal/codechal_kernel_olp_mdf_xe_xpm.h
index b667cd65..53322a37 100644
--- a/media_driver/agnostic/Xe_M/Xe_XPM/codec/hal/codechal_kernel_olp_mdf_xe_xpm.h
+++ b/media_driver/agnostic/Xe_M/Xe_XPM/codec/hal/codechal_kernel_olp_mdf_xe_xpm.h
@@ -82,6 +82,7 @@ protected:
     MOS_STATUS SetKernelArgs(uint16_t flags, bool uv);
 
 protected:
+    PMOS_INTERFACE      m_osInterface = nullptr;
     CmDevice            *m_cmDevice = nullptr;
     CmQueue             *m_cmQueue = nullptr;
     CmTask              *m_cmTask = nullptr;
diff --git a/media_driver/agnostic/Xe_M/Xe_XPM/vp/hal/vphal_render_vebox_xe_xpm_denoise.cpp b/media_driver/agnostic/Xe_M/Xe_XPM/vp/hal/vphal_render_vebox_xe_xpm_denoise.cpp
index 4e1f3f31..7bca3440 100644
--- a/media_driver/agnostic/Xe_M/Xe_XPM/vp/hal/vphal_render_vebox_xe_xpm_denoise.cpp
+++ b/media_driver/agnostic/Xe_M/Xe_XPM/vp/hal/vphal_render_vebox_xe_xpm_denoise.cpp
@@ -175,7 +175,7 @@ VphalHVSDenoiserHpm::VphalHVSDenoiserHpm(PRENDERHAL_INTERFACE renderHal) : m_eve
 {
     VPHAL_RENDER_CHK_NULL_NO_STATUS_RETURN(m_renderHal);
     VPHAL_RENDER_CHK_NULL_NO_STATUS_RETURN(m_renderHal->pOsInterface);
-    m_cmContext    = MOS_New(CmContext, m_renderHal->pOsInterface->pOsContext);
+    m_cmContext    = MOS_New(CmContext, m_renderHal->pOsInterface);
     m_eventManager = MOS_New(EventManager, "HVSEventManager", m_cmContext);
     VPHAL_RENDER_NORMALMESSAGE("Constructor!");
 }
diff --git a/media_driver/agnostic/common/cm/cm_device_rt_base.h b/media_driver/agnostic/common/cm/cm_device_rt_base.h
index 3c4859e5..c9c5fec8 100644
--- a/media_driver/agnostic/common/cm/cm_device_rt_base.h
+++ b/media_driver/agnostic/common/cm/cm_device_rt_base.h
@@ -327,30 +327,30 @@ public:
 
     uint32_t GetAccelsize(){ return m_accelSize; }
 
-    int32_t GetHalMaxValues(CM_HAL_MAX_VALUES* & pHalMaxValues,
+    virtual int32_t GetHalMaxValues(CM_HAL_MAX_VALUES* & pHalMaxValues,
                             CM_HAL_MAX_VALUES_EX* & pHalMaxValuesEx);
 
-    int32_t GetGenPlatform(uint32_t &platform);
+    virtual int32_t GetGenPlatform(uint32_t &platform);
 
     void Sampler8x8CoefficientFormatTransform(
          CM_AVS_INTERNEL_NONPIPLINED_STATE* dst_avs_state,
          CM_AVS_NONPIPLINED_STATE* src_avs_state);
 
-    int32_t GetSurfaceManager(CmSurfaceManager* &pSurfaceMgr);
+    virtual int32_t GetSurfaceManager(CmSurfaceManager* &pSurfaceMgr);
 
-    std::vector<CmQueueRT *> &GetQueue();
+    virtual std::vector<CmQueueRT *> &GetQueue();
 
-    CSync* GetSurfaceLock();
+    virtual CSync* GetSurfaceLock();
 
-    CSync* GetSurfaceCreationLock();
+    virtual CSync* GetSurfaceCreationLock();
 
-    CSync* GetProgramKernelLock();
+    virtual CSync* GetProgramKernelLock();
 
-    CSync* GetQueueLock();
+    virtual CSync* GetQueueLock();
 
-    int32_t LoadPredefinedCopyKernel(CmProgram*& pProgram);
+    virtual int32_t LoadPredefinedCopyKernel(CmProgram*& pProgram);
 
-    int32_t LoadPredefinedInitKernel(CmProgram*& pProgram);
+    virtual int32_t LoadPredefinedInitKernel(CmProgram*& pProgram);
 
     int32_t GetKernelSlot()
     {
@@ -359,8 +359,8 @@ public:
 
     int32_t PrepareGPUinitSurface();
 
-    int32_t GPUinitSurface(CmSurface2D* surf2D, const uint32_t initValue, CmEvent*& event);
-    bool CheckGTPinEnabled();
+    virtual int32_t GPUinitSurface(CmSurface2D* surf2D, const uint32_t initValue, CmEvent*& event);
+    virtual bool CheckGTPinEnabled();
 
 #if USE_EXTENSION_CODE
     int32_t EnableGTPin(CmBufferUP* pBufferUP0,
@@ -369,10 +369,10 @@ public:
                         char * pGTPinCom,
                         GTPIN_INVOKE_STRUCT* pInvokeStruct,
                         bool reserveRegisters);
-    CmGTPin *GetGTPin();
+    virtual CmGTPin *GetGTPin();
 #endif
 
-    int32_t GetGenStepInfo(char*& stepinfostr);
+    virtual int32_t GetGenStepInfo(char*& stepinfostr);
 
     int32_t GetCapsInternal(void *pCaps, uint32_t *puSize);
 
@@ -380,11 +380,11 @@ public:
 
     int32_t Release();
 
-    int32_t GetPrintBufferIndex(SurfaceIndex *& pIndex) const;
+    virtual int32_t GetPrintBufferIndex(SurfaceIndex *& pIndex) const;
 
-    bool IsPrintEnable() const;
+    virtual bool IsPrintEnable() const;
 
-    bool IsVtuneLogOn() const;
+    virtual bool IsVtuneLogOn() const;
 
     int32_t GetPrintBufferMem(unsigned char *& pPrintBufferMem) const;
 
@@ -397,9 +397,9 @@ public:
                             bool bIsCmCreated,
                             CmSurface2D* & pSurface) = 0;
 
-    int32_t GetSampler8x8(uint32_t index, CmSampler8x8State_RT *&pSampler8x8);
+    virtual int32_t GetSampler8x8(uint32_t index, CmSampler8x8State_RT *&pSampler8x8);
 
-    bool IsScratchSpaceDisabled();
+    virtual bool IsScratchSpaceDisabled();
 
     int32_t SetSurfaceArraySizeForAlias();
 
@@ -410,18 +410,18 @@ public:
         m_isDriverStoreEnabled = dsEnabled;
     }
 
-    CmDynamicArray* GetKernelArray();
+    virtual CmDynamicArray* GetKernelArray();
 
-    uint32_t *GetKernelCount();
+    virtual uint32_t *GetKernelCount();
 
 #if CM_LOG_ON
     std::string Log();
 #endif
-    CM_HAL_STATE* GetHalState();
+    virtual CM_HAL_STATE* GetHalState();
 
     int32_t DestroyVmeSurface(SurfaceIndex *& pVmeIndex);
 
-    int32_t CreatePrintBuffer();
+    virtual int32_t CreatePrintBuffer();
 
     CmNotifierGroup* GetNotifiers() {return m_notifierGroup;}
 
diff --git a/media_driver/agnostic/common/cm/cm_hal.cpp b/media_driver/agnostic/common/cm/cm_hal.cpp
index cec4e692..ad9583e6 100644
--- a/media_driver/agnostic/common/cm/cm_hal.cpp
+++ b/media_driver/agnostic/common/cm/cm_hal.cpp
@@ -86,9 +86,6 @@ int32_t HalCm_InsertCloneKernel(
     PCM_HAL_KERNEL_PARAM       kernelParam,
     PRENDERHAL_KRN_ALLOCATION  &kernelAllocation);
 
-extern MOS_STATUS HalCm_GetSipBinary(
-    PCM_HAL_STATE   state);
-
 #if MDF_COMMAND_BUFFER_DUMP
 extern int32_t HalCm_InitDumpCommandBuffer(PCM_HAL_STATE state);
 
@@ -2135,7 +2132,7 @@ int32_t HalCm_UnloadKernel(
         goto finish;
     }
 
-    CM_CHK_CMSTATUS_GOTOFINISH(HalCm_SyncKernel(state, kernelAllocation->dwSync));
+    CM_CHK_CMSTATUS_GOTOFINISH(state->pfnSyncKernel(state, kernelAllocation->dwSync));
 
     // Unload kernel
     if (kernelAllocation->pMhwKernelParam)
@@ -4333,7 +4330,7 @@ MOS_STATUS HalCm_Setup2DSurfaceState(
 
     if (state->cmHalInterface->GetDecompressFlag())
     {
-        HalCm_DecompressSurface(state, argParam, threadIndex);
+        state->pfnDecompressSurface(state, argParam, threadIndex);
     }
 
     //Binding surface based at the unit of dword
@@ -9139,11 +9136,11 @@ MOS_STATUS HalCm_RegisterSampler(
     {
         entry->ElementType = MHW_Sampler4Elements;
     }
-    CM_CHK_MOSSTATUS_GOTOFINISH(HalCm_GetGfxMapFilter(param->minFilter,  &entry->Unorm.MinFilter));
-    CM_CHK_MOSSTATUS_GOTOFINISH(HalCm_GetGfxMapFilter(param->magFilter,  &entry->Unorm.MagFilter));
-    CM_CHK_MOSSTATUS_GOTOFINISH(HalCm_GetGfxTextAddress(param->addressU, &entry->Unorm.AddressU));
-    CM_CHK_MOSSTATUS_GOTOFINISH(HalCm_GetGfxTextAddress(param->addressV, &entry->Unorm.AddressV));
-    CM_CHK_MOSSTATUS_GOTOFINISH(HalCm_GetGfxTextAddress(param->addressW, &entry->Unorm.AddressW));
+    CM_CHK_MOSSTATUS_GOTOFINISH(state->pfnGetGfxMapFilter(param->minFilter,  &entry->Unorm.MinFilter));
+    CM_CHK_MOSSTATUS_GOTOFINISH(state->pfnGetGfxMapFilter(param->magFilter,  &entry->Unorm.MagFilter));
+    CM_CHK_MOSSTATUS_GOTOFINISH(state->pfnGetGfxTextAddress(param->addressU, &entry->Unorm.AddressU));
+    CM_CHK_MOSSTATUS_GOTOFINISH(state->pfnGetGfxTextAddress(param->addressV, &entry->Unorm.AddressV));
+    CM_CHK_MOSSTATUS_GOTOFINISH(state->pfnGetGfxTextAddress(param->addressW, &entry->Unorm.AddressW));
 
     entry->Unorm.SurfaceFormat = (MHW_SAMPLER_SURFACE_PIXEL_TYPE)param->surfaceFormat;
     switch (entry->Unorm.SurfaceFormat)
@@ -10679,12 +10676,13 @@ MOS_STATUS HalCm_Create(
     state->pfnSetSurfaceReadFlag          = HalCm_SetSurfaceReadFlag;
     state->pfnSetVtuneProfilingFlag       = HalCm_SetVtuneProfilingFlag;
     state->pfnExecuteVeboxTask            = HalCm_ExecuteVeboxTask;
-    state->pfnGetSipBinary                = HalCm_GetSipBinary;
     state->pfnGetTaskSyncLocation         = HalCm_GetTaskSyncLocation;
 
     state->pfnGetGlobalTime               = HalCm_GetGlobalTime;
     state->pfnConvertToQPCTime            = HalCm_ConvertToQPCTime;
 
+    state->pfnSyncOnResource              = HalCm_SyncOnResource;
+
     state->pfnDeleteFromStateBufferList = HalCm_DeleteFromStateBufferList;
     state->pfnGetMediaStatePtrForKernel = HalCm_GetMediaStatePtrForKernel;
     state->pfnGetStateBufferVAPtrForSurfaceIndex = HalCm_GetStateBufferVAPtrForSurfaceIndex;
@@ -10704,6 +10702,8 @@ MOS_STATUS HalCm_Create(
     //==========<Initialize 5 OS-dependent DDI functions: pfnAllocate3DResource, pfnAllocateSurface2DUP====
     //                 pfnAllocateBuffer,pfnRegisterKMDNotifyEventHandle, pfnGetSurface2DPitchAndSize >====
     HalCm_OsInitInterface(state);
+    
+    state->osInterface->pfnInitCmInterface(state);
 
     HalCm_InitPerfTagIndexMap(state);
 
diff --git a/media_driver/agnostic/common/cm/cm_hal.h b/media_driver/agnostic/common/cm/cm_hal.h
index 2dc3b071..50b8ee45 100644
--- a/media_driver/agnostic/common/cm/cm_hal.h
+++ b/media_driver/agnostic/common/cm/cm_hal.h
@@ -30,6 +30,7 @@
 #include "cm_common.h"
 #include "cm_debug.h"
 #include "cm_csync.h"
+#include "cm_ish.h"
 #include "mhw_vebox.h"
 #include "cm_hal_generic.h"
 #include "media_perf_profiler.h"
@@ -1863,6 +1864,42 @@ typedef struct _CM_HAL_STATE
         PCM_HAL_STATE state,
         MOS_GPUCTX_CREATOPTIONS *mosCreateOption);
 
+    MOS_STATUS(*pfnGetGfxMapFilter) (
+        uint32_t                     filter,
+        MHW_GFX3DSTATE_MAPFILTER     *pGfxFilter);
+
+    MOS_STATUS(*pfnGetGfxTextAddress) (
+        uint32_t                     addressMode,
+        MHW_GFX3DSTATE_TEXCOORDMODE  *gfxAddress);
+    
+    MOS_STATUS(*pfnDecompressSurface) (
+        PCM_HAL_STATE                state,
+        PCM_HAL_KERNEL_ARG_PARAM     argParam,
+        uint32_t                     threadIndex);
+
+    MOS_STATUS (*pfnSetOsResourceFromDdi)(
+        PMOS_RESOURCE     resource,
+        PMOS_RESOURCE     osResource,
+        uint32_t          mipSlice);
+
+    int32_t (*pfnSyncKernel)(
+        PCM_HAL_STATE     state,
+        uint32_t          sync);
+
+    MOS_STATUS (*pfnSurfaceSync)(
+        PCM_HAL_STATE     pState,
+        PMOS_SURFACE      pSurface,
+        bool              bReadSync);
+
+    MOS_STATUS (*pfnSyncOnResource)(
+        PCM_HAL_STATE     state,
+        PMOS_SURFACE      surface,
+        bool              isWrite);
+    
+    MOS_STATUS (*pfnCreateSipKernel)(
+        PCM_HAL_STATE     state,
+        CmISH             *cmISH);
+
     //*-----------------------------------------------------------------------------
     //| Purpose: Selects the required stream index and sets the correct GPU context for further function calls.
     //| Returns: Previous stream index.
@@ -2047,6 +2084,37 @@ MOS_STATUS HalCm_SendGpGpuWalkerState(
     PCM_HAL_KERNEL_PARAM    kernelParam,
     PMOS_COMMAND_BUFFER     cmdBuffer);
 
+MOS_STATUS HalCm_SetOsResourceFromDdi(
+    PMOS_RESOURCE     resource,
+    PMOS_RESOURCE     osResource,
+    uint32_t          mipSlice = 0);
+
+MOS_STATUS HalCm_GetSurface2DPitchAndSize(
+    PCM_HAL_STATE               state,
+    PCM_HAL_SURFACE2D_UP_PARAM  param);
+
+MOS_STATUS HalCm_GetGPUCurrentFrequency(
+    PCM_HAL_STATE               state,
+    uint32_t                    *currentFreq);
+
+MOS_STATUS HalCm_RegisterUMDNotifyEventHandle(
+    PCM_HAL_STATE               state,
+    PCM_HAL_OSSYNC_PARAM        syncParam);
+
+MOS_STATUS HalCm_GetGpuTime(
+    PCM_HAL_STATE               state,
+    uint64_t                    *gpuTime);
+
+uint32_t HalCm_RegisterStream(
+    PCM_HAL_STATE               state);
+
+MOS_STATUS HalCm_GetSipBinary(
+    PCM_HAL_STATE               state);
+
+MOS_STATUS HalCm_CreateSipKernel(
+    PCM_HAL_STATE               state,
+    CmISH                       *cmISH);
+
 //===============<Below are Os-non-dependent Private/Non-DDI Functions>=========================================
 
 uint32_t HalCm_GetFreeBindingIndex(
diff --git a/media_driver/agnostic/common/cm/cm_ish_base.cpp b/media_driver/agnostic/common/cm/cm_ish_base.cpp
index 626d4c59..8dcab768 100644
--- a/media_driver/agnostic/common/cm/cm_ish_base.cpp
+++ b/media_driver/agnostic/common/cm/cm_ish_base.cpp
@@ -30,6 +30,10 @@
 using namespace CMRT_UMD;
 
 CmISHBase::CmISHBase():
+    m_isSipKernelLoaded(false),
+    m_sipKernel(nullptr),
+    m_sipKernelSize(0),
+    m_sipKernelOffset(0),
     m_osInterface(nullptr),
     m_resource(nullptr),
     m_lockedData(nullptr),
@@ -37,11 +41,7 @@ CmISHBase::CmISHBase():
     m_offset(0),
     m_trackerProducer(nullptr),
     m_lastTrackerToken(nullptr),
-    m_addedKernelCount(0),
-    m_isSipKernelLoaded(false),
-    m_sipKernel(nullptr),
-    m_sipKernelSize(0),
-    m_sipKernelOffset(0)
+    m_addedKernelCount(0)
 {
 
 }
diff --git a/media_driver/agnostic/common/cm/cm_ish_base.h b/media_driver/agnostic/common/cm/cm_ish_base.h
index 8f1bc1cb..b6322687 100644
--- a/media_driver/agnostic/common/cm/cm_ish_base.h
+++ b/media_driver/agnostic/common/cm/cm_ish_base.h
@@ -52,6 +52,12 @@ public:
 
     void Clean();
 
+    // SIP kernels
+    bool m_isSipKernelLoaded;
+    uint8_t *m_sipKernel;
+    uint32_t m_sipKernelSize;
+    uint32_t m_sipKernelOffset;
+
 protected:
     CmISHBase();
     virtual ~CmISHBase();
@@ -86,10 +92,5 @@ protected:
     const uint32_t m_expandStep = 0x80000;
     const uint32_t m_kernelAlign = 64;
     const uint32_t m_kernelPadding = 128;
-    
-    // SIP kernels
-    bool m_isSipKernelLoaded;
-    uint8_t *m_sipKernel;
-    uint32_t m_sipKernelSize;
-    uint32_t m_sipKernelOffset;
+
 };
diff --git a/media_driver/agnostic/common/cm/cm_rt_umd.h b/media_driver/agnostic/common/cm/cm_rt_umd.h
index 5f9d8c59..96f1357c 100644
--- a/media_driver/agnostic/common/cm/cm_rt_umd.h
+++ b/media_driver/agnostic/common/cm/cm_rt_umd.h
@@ -42,27 +42,8 @@
 #include "cm_thread_space.h"
 #include "cm_vebox.h"
 #include "cm_type.h"
-using namespace CMRT_UMD;
-
 
-//!
-//! \brief    Creates a CmDevice from a MOS context.
-//! \details  If an existing CmDevice has already associated to the MOS context,
-//!           the existing CmDevice will be returned. Otherwise, a new CmDevice
-//!           instance will be created and associatied with that MOS context.
-//! \param    mosContext
-//!           [in] pointer to MOS conetext.
-//! \param    device
-//!           [in,out] reference to the pointer to the CmDevice.
-//! \param    devCreateOption
-//!           [in] option to customize CmDevice.
-//! \retval   CM_SUCCESS if the CmDevice is successfully created.
-//! \retval   CM_NULL_POINTER if pMosContext is null.
-//! \retval   CM_FAILURE otherwise.
-//!
-CM_RT_API int32_t CreateCmDevice(MOS_CONTEXT *mosContext,
-                                 CmDevice* &device,
-                                 uint32_t devCreateOption);
+using namespace CMRT_UMD;
 
 //!
 //! \brief    Creates a CmDevice from a MOS context.
@@ -84,7 +65,7 @@ CM_RT_API int32_t CreateCmDevice(MOS_CONTEXT *mosContext,
 CM_RT_API int32_t CreateCmDevice(MOS_CONTEXT *mosContext,
                                  CmDevice *&  device,
                                  uint32_t devCreateOption,
-                                 uint8_t  priority);
+                                 uint8_t  priority = CM_DEVICE_CREATE_PRIORITY_DEFAULT);
 
 //!
 //! \brief    Destroys the CmDevice. 
diff --git a/media_driver/agnostic/common/cm/cm_surface_manager_base.h b/media_driver/agnostic/common/cm/cm_surface_manager_base.h
index 676b3a7c..01004e99 100644
--- a/media_driver/agnostic/common/cm/cm_surface_manager_base.h
+++ b/media_driver/agnostic/common/cm/cm_surface_manager_base.h
@@ -60,7 +60,7 @@ public:
                          PMOS_RESOURCE pMosResource, void* &pSysMem,
                          bool isConditionalBuffer, uint32_t comparisonValue );
     int32_t DestroySurface( CmBuffer_RT* & pSurface, SURFACE_DESTROY_KIND destroyKind);
-    int32_t UpdateBuffer(MOS_RESOURCE * mosResource, int index, uint32_t handle);
+    virtual int32_t UpdateBuffer(MOS_RESOURCE * mosResource, int index, uint32_t handle);
 
     int32_t CreateSurface2DUP(uint32_t width, uint32_t height,
                               CM_SURFACE_FORMAT format, void* pSysMem,
@@ -95,10 +95,10 @@ public:
 
     int32_t DestroySurface( CmSurfaceSampler8x8* & pSurfaceSampler8x8 );
 
-    int32_t GetSurface( const uint32_t index, CmSurface* & pSurface );
-    int32_t GetCmDevice( CmDeviceRT* & pCmDevice );
+    virtual int32_t GetSurface( const uint32_t index, CmSurface* & pSurface );
+    virtual int32_t GetCmDevice( CmDeviceRT* & pCmDevice );
 
-    int32_t GetPixelBytesAndHeight(uint32_t width, uint32_t height,
+    virtual int32_t GetPixelBytesAndHeight(uint32_t width, uint32_t height,
                                    CM_SURFACE_FORMAT format, uint32_t& sizePerPixel,
                                    uint32_t& updatedHeight);
     virtual int32_t Surface2DSanityCheck(uint32_t width, uint32_t height, CM_SURFACE_FORMAT format) = 0;
@@ -111,10 +111,10 @@ public:
                                  SurfaceIndex* & pSamplerSurfaceIndex);
     int32_t DestroySamplerSurface(SurfaceIndex* & pSamplerSurfaceIndex );
     int32_t DestroySurface( CmSurfaceSampler* & pSurfaceSampler );
-    uint32_t GetSurfacePoolSize();
+    virtual uint32_t GetSurfacePoolSize();
     int32_t IncreaseSurfaceUsage(uint32_t index);
     int32_t DecreaseSurfaceUsage(uint32_t index);
-    int32_t RefreshDelayDestroySurfaces(uint32_t &freeSurfaceCount);
+    virtual int32_t RefreshDelayDestroySurfaces(uint32_t &freeSurfaceCount);
     int32_t TouchSurfaceInPoolForDestroy();
     int32_t GetFreeSurfaceIndexFromPool(uint32_t &freeIndex);
     int32_t GetFreeSurfaceIndex(uint32_t &index);
@@ -126,7 +126,7 @@ public:
     int32_t DestroySurfaceArrayElement( uint32_t index );
     inline int32_t GetMemorySizeOfSurfaces();
 
-    int32_t GetSurfaceArraySize(uint32_t& surfaceArraySize);
+    virtual int32_t GetSurfaceArraySize(uint32_t& surfaceArraySize);
 
     int32_t UpdateStateForDelayedDestroy(SURFACE_DESTROY_KIND destroyKind, uint32_t i);
 
@@ -137,20 +137,20 @@ public:
     int32_t UpdateProfileFor3DSurface(uint32_t index, uint32_t width,
                                       uint32_t height, uint32_t depth, CM_SURFACE_FORMAT format);
 
-    int32_t UpdateSurface2DTableMosResource( uint32_t index, PMOS_RESOURCE pMosResource );
-    int32_t UpdateSurface2DTableRotation(uint32_t index, CM_ROTATION rotationFlag);
+    virtual int32_t UpdateSurface2DTableMosResource( uint32_t index, PMOS_RESOURCE pMosResource );
+    virtual int32_t UpdateSurface2DTableRotation(uint32_t index, CM_ROTATION rotationFlag);
 
-    int32_t UpdateSurface2DTableFrameType(uint32_t index, CM_FRAME_TYPE frameType);
-    int32_t UpdateSurface2DTableChromaSiting(uint32_t index, int32_t chromaSiting);
+    virtual int32_t UpdateSurface2DTableFrameType(uint32_t index, CM_FRAME_TYPE frameType);
+    virtual int32_t UpdateSurface2DTableChromaSiting(uint32_t index, int32_t chromaSiting);
 
     int32_t DestroyStateBuffer( CmStateBuffer *&buffer_ptr,
                                 SURFACE_DESTROY_KIND destroyKind );
     int32_t DestroyMediaState( void  *media_state_ptr );
 
-    bool IsCmReservedSurfaceIndex(uint32_t surfBTI);
-    bool IsValidSurfaceIndex(uint32_t surfBTI);
+    virtual bool IsCmReservedSurfaceIndex(uint32_t surfBTI);
+    virtual bool IsValidSurfaceIndex(uint32_t surfBTI);
     uint32_t MaxIndirectSurfaceCount();
-    uint32_t ValidSurfaceIndexStart();
+    virtual uint32_t ValidSurfaceIndexStart();
     bool IsSupportedForSamplerSurface2D(CM_SURFACE_FORMAT format);
     inline void SetLatestVeboxTrackerAddr(uint32_t *tracker) {m_latestVeboxTracker = tracker; }
     inline uint32_t LatestVeboxTracker() {return *m_latestVeboxTracker; }
@@ -160,7 +160,7 @@ public:
     std::set<CmSurface *> & GetStatelessSurfaceArray() { return m_statelessSurfaceArray; }
 
 #if MDF_SURFACE_CONTENT_DUMP
-    CM_HAL_STATE* GetHalState();
+    virtual CM_HAL_STATE* GetHalState();
 #endif  // #if MDF_SURFACE_CONTENT_DUMP
 
 protected:
diff --git a/media_driver/agnostic/common/cm/cm_wrapper.h b/media_driver/agnostic/common/cm/cm_wrapper.h
index 2371fe3e..24b2290c 100644
--- a/media_driver/agnostic/common/cm/cm_wrapper.h
+++ b/media_driver/agnostic/common/cm/cm_wrapper.h
@@ -549,13 +549,6 @@ int32_t CmThinExecuteInternal(CmDevice *device,
                         void *inputData,
                         uint32_t inputDataLen);
 
-// Below APIs are called in CmThinExecute(), so they are declared here again.
-extern int32_t CreateCmDevice(MOS_CONTEXT *mosContext,
-                              CmDevice* &device,
-                              uint32_t devCreateOption);
-
-extern int32_t DestroyCmDevice(CmDevice* &device);
-
 namespace CMRT_UMD
 {
 // class of CmWrapperEx for functionality extention in cm wrapper
diff --git a/media_driver/agnostic/common/cm/media_srcs.cmake b/media_driver/agnostic/common/cm/media_srcs.cmake
index f93b2da1..ecc3a551 100644
--- a/media_driver/agnostic/common/cm/media_srcs.cmake
+++ b/media_driver/agnostic/common/cm/media_srcs.cmake
@@ -23,7 +23,6 @@ set(TMP_SOURCES_
     ${CMAKE_CURRENT_LIST_DIR}/cm_buffer_rt.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_state_buffer.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_def.cpp
-    ${CMAKE_CURRENT_LIST_DIR}/cm_device_rt_base.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_event_rt.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_group_space.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_hal.cpp
@@ -44,7 +43,6 @@ set(TMP_SOURCES_
     ${CMAKE_CURRENT_LIST_DIR}/cm_surface.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_surface_2d_up_rt.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_surface_3d_rt.cpp
-    ${CMAKE_CURRENT_LIST_DIR}/cm_surface_manager_base.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_surface_sampler.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_surface_sampler8x8.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_surface_vme.cpp
@@ -54,7 +52,6 @@ set(TMP_SOURCES_
     ${CMAKE_CURRENT_LIST_DIR}/cm_vebox_rt.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_vebox_data.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_visa.cpp
-    ${CMAKE_CURRENT_LIST_DIR}/cm_global_api.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_execution_adv.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_ish_base.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_kernel_ex.cpp
@@ -67,8 +64,7 @@ set(TMP_SOURCES_
     ${CMAKE_CURRENT_LIST_DIR}/cm_tracker.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_event_ex_base.cpp
     ${CMAKE_CURRENT_LIST_DIR}/cm_command_buffer.cpp
-    ${CMAKE_CURRENT_LIST_DIR}/cm_surface_2d_rt_base.cpp
-    ${CMAKE_CURRENT_LIST_DIR}/cm_wrapper.cpp)
+    ${CMAKE_CURRENT_LIST_DIR}/cm_surface_2d_rt_base.cpp)
 
 set(TMP_HEADERS_
     ${CMAKE_CURRENT_LIST_DIR}/cm_array.h
@@ -120,9 +116,6 @@ set(TMP_HEADERS_
     ${CMAKE_CURRENT_LIST_DIR}/cm_vebox_data.h
     ${CMAKE_CURRENT_LIST_DIR}/cm_visa.h
     ${CMAKE_CURRENT_LIST_DIR}/cm_execution_adv.h
-    ${CMAKE_CURRENT_LIST_DIR}/cm_rt_umd.h
-    ${CMAKE_CURRENT_LIST_DIR}/cm_surface_manager_base.h
-    ${CMAKE_CURRENT_LIST_DIR}/cm_device_rt_base.h
     ${CMAKE_CURRENT_LIST_DIR}/cm_ish_base.h
     ${CMAKE_CURRENT_LIST_DIR}/cm_kernel_ex.h
     ${CMAKE_CURRENT_LIST_DIR}/cm_surface_state.h
@@ -134,7 +127,6 @@ set(TMP_HEADERS_
     ${CMAKE_CURRENT_LIST_DIR}/cm_tracker.h
     ${CMAKE_CURRENT_LIST_DIR}/cm_event_ex_base.h
     ${CMAKE_CURRENT_LIST_DIR}/cm_command_buffer.h
-    ${CMAKE_CURRENT_LIST_DIR}/cm_wrapper.h
     ${CMAKE_CURRENT_LIST_DIR}/cm_surface_2d_rt_base.h)
 
 set(COMMON_SOURCES_
@@ -150,9 +142,31 @@ set(COMMON_PRIVATE_INCLUDE_DIRS_
     ${CMAKE_CURRENT_LIST_DIR}
 )
 
+set(TMP_1_SOURCES_
+    ${CMAKE_CURRENT_LIST_DIR}/cm_global_api.cpp
+    ${CMAKE_CURRENT_LIST_DIR}/cm_device_rt_base.cpp
+    ${CMAKE_CURRENT_LIST_DIR}/cm_surface_manager_base.cpp
+    ${CMAKE_CURRENT_LIST_DIR}/cm_wrapper.cpp
+)
+
+set(TMP_1_HEADERS_
+    ${CMAKE_CURRENT_LIST_DIR}/cm_rt_umd.h
+    ${CMAKE_CURRENT_LIST_DIR}/cm_device_rt_base.h
+    ${CMAKE_CURRENT_LIST_DIR}/cm_surface_manager_base.h
+    ${CMAKE_CURRENT_LIST_DIR}/cm_wrapper.h
+)
+
+set(SOURCES_
+    ${SOURCES_} 
+    ${TMP_1_SOURCES_})
+
+set(HEADERS_
+    ${HEADERS_} 
+    ${TMP_1_HEADERS_})
+
 set(SOURCES_SSE2
     ${CMAKE_CURRENT_LIST_DIR}/cm_mem_sse2_impl.cpp)
 
-source_group(CM FILES ${TMP_SOURCES_} ${TMP_HEADERS_})
+source_group(CM FILES ${TMP_SOURCES_} ${TMP_HEADERS_} ${TMP_1_SOURCES_} ${TMP_1_HEADERS_})
 
 media_add_curr_to_include_path()
\ No newline at end of file
diff --git a/media_driver/agnostic/common/codec/hal/codechal_decode_nv12top010.cpp b/media_driver/agnostic/common/codec/hal/codechal_decode_nv12top010.cpp
index 8d92c459..f45027e7 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_decode_nv12top010.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_decode_nv12top010.cpp
@@ -38,15 +38,16 @@ MOS_STATUS CodechalDecodeNV12ToP010::Init(PMOS_INTERFACE osInterface)
     CODECHAL_DECODE_FUNCTION_ENTER;
 
     CODECHAL_DECODE_CHK_NULL_RETURN(osInterface);
-
+    m_osInterface = osInterface;
     uint32_t devCreateOption = CM_DEVICE_CREATE_OPTION_FOR_HEVC;
     devCreateOption &= (~CM_DEVICE_CONFIG_GPUCONTEXT_ENABLE);
 
     osInterface->pfnNotifyStreamIndexSharing(osInterface);
-    CODECHAL_DECODE_CHK_STATUS_RETURN(CreateCmDevice(
+    CODECHAL_DECODE_CHK_STATUS_RETURN(osInterface->pfnCreateCmDevice(
         osInterface->pOsContext,
         m_cmDevice,
-        devCreateOption));
+        devCreateOption,
+        CM_DEVICE_CREATE_PRIORITY_DEFAULT));
 
     CODECHAL_DECODE_CHK_STATUS_RETURN(m_cmDevice->CreateQueue(
         m_cmQueue));
@@ -148,7 +149,9 @@ CodechalDecodeNV12ToP010::~CodechalDecodeNV12ToP010()
         m_cmDevice->DestroyKernel(m_cmKernel);
         m_cmKernel = nullptr;
     }
-
-    DestroyCmDevice(m_cmDevice);
+    if (m_osInterface != nullptr)
+    {
+        m_osInterface->pfnDestroyCmDevice(m_cmDevice);
+    }
 }
 
diff --git a/media_driver/agnostic/common/codec/hal/codechal_decode_nv12top010.h b/media_driver/agnostic/common/codec/hal/codechal_decode_nv12top010.h
index 7c68c450..d0a32ef9 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_decode_nv12top010.h
+++ b/media_driver/agnostic/common/codec/hal/codechal_decode_nv12top010.h
@@ -87,6 +87,8 @@ private:
     CmTask          *m_cmTask = nullptr;
     //! \brief Pointer to CM thread space
     CmThreadSpace   *m_cmThreadSpace = nullptr;
+    //! \brief Pointer to os interface
+    PMOS_INTERFACE  m_osInterface = nullptr;
 };
 
 #endif
diff --git a/media_driver/agnostic/common/codec/hal/codechal_encode_avc_base.cpp b/media_driver/agnostic/common/codec/hal/codechal_encode_avc_base.cpp
index 2a4b6647..9930c6e3 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_encode_avc_base.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_encode_avc_base.cpp
@@ -2345,6 +2345,12 @@ MOS_STATUS CodechalEncodeAvcBase::SetSequenceStructs()
 
     auto seqParams = m_avcSeqParam;
 
+    if (seqParams->FrameHeight > m_rawSurface.dwHeight || seqParams->FrameWidth > m_rawSurface.dwWidth)
+    {
+        CODECHAL_ENCODE_ASSERTMESSAGE("Error: Allocated surface width and height cannot be less than SPS width and height");
+        return MOS_STATUS_INVALID_PARAMETER;
+    }
+
     // seq_scaling_matrix_present_flag and chroma_format_idc
     // shall not be present for main profile
     if (seqParams->Profile == CODEC_AVC_MAIN_PROFILE)
diff --git a/media_driver/agnostic/common/codec/hal/codechal_encoder_base.cpp b/media_driver/agnostic/common/codec/hal/codechal_encoder_base.cpp
index d30e9adc..7f02fe9c 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_encoder_base.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_encoder_base.cpp
@@ -1080,8 +1080,9 @@ MOS_STATUS CodechalEncoderState::AllocateMDFResources()
 
         if (m_cmDev == nullptr)
         {
+            CODECHAL_ENCODE_CHK_NULL_RETURN(m_osInterface);
             m_osInterface->pfnNotifyStreamIndexSharing(m_osInterface);
-            CODECHAL_ENCODE_CHK_STATUS_RETURN(CreateCmDevice(m_osInterface->pOsContext, m_cmDev, devOp));
+            CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnCreateCmDevice(m_osInterface->pOsContext, m_cmDev, devOp, CM_DEVICE_CREATE_PRIORITY_DEFAULT));
         }
         //just WA for issues in MDF null support
         if (!m_cmQueue)
@@ -1105,9 +1106,9 @@ MOS_STATUS CodechalEncoderState::DestroyMDFResources()
         m_cmDev->DestroyTask(m_cmTask);
         m_cmTask = nullptr;
     }
-    if (m_cmDev)
+    if (m_cmDev && m_osInterface)
     {
-        DestroyCmDevice(m_cmDev);
+        m_osInterface->pfnDestroyCmDevice(m_cmDev);
         m_cmDev = nullptr;
     }
 
diff --git a/media_driver/agnostic/common/codec/hal/codechal_encoder_base.h b/media_driver/agnostic/common/codec/hal/codechal_encoder_base.h
index 20185ded..2a1f7808 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_encoder_base.h
+++ b/media_driver/agnostic/common/codec/hal/codechal_encoder_base.h
@@ -1996,7 +1996,7 @@ public:
     //! \return MOS_STATUS
     //!         MOS_STATUS_SUCCESS if success, else fail reason
     //!
-    MOS_STATUS CreateGpuContexts();
+    virtual MOS_STATUS CreateGpuContexts();
 
     //!
     //! \brief  Verify Space Available
diff --git a/media_driver/agnostic/common/renderhal/renderhal_legacy.cpp b/media_driver/agnostic/common/renderhal/renderhal_legacy.cpp
index a440a8d3..bd4fb460 100644
--- a/media_driver/agnostic/common/renderhal/renderhal_legacy.cpp
+++ b/media_driver/agnostic/common/renderhal/renderhal_legacy.cpp
@@ -27,6 +27,86 @@
 
 #include "renderhal_legacy.h"
 
+//!
+//! \brief    Create Interface
+//! \details  Create RenderHal Interface structure, responsible for HW
+//!           abstraction of HW Rendering Engine for CM(MDF) and VP.
+//! \param    PRENDERHAL_INTERFACE renderHal
+//!           [in/out] Pointer to Hardware Interface Structure
+//! \param    MhwCpInterface **cpInterface
+//!           [out] Pointer of pointer to MHW CP Interface Structure, which
+//!           is created during renderhal initialization
+//! \param    PMOS_INTERFACE osInterface
+//!           [in] Pointer to OS Interface Structure
+//! \param    PRENDERHAL_SETTINGS_LEGACY renderHalSettings
+//!           [in] Pointer to RenderHal Settings
+//!
+MOS_STATUS Create_RenderHal_Interface_Legacy(
+    PRENDERHAL_INTERFACE &renderHal,
+    MhwCpInterface       **cpInterface,
+    PMOS_INTERFACE       osInterface,
+    PRENDERHAL_SETTINGS_LEGACY renderHalSettings)
+{
+    MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
+    if (!cpInterface || !osInterface || !renderHalSettings)
+    {
+        MHW_RENDERHAL_ASSERTMESSAGE("Invalid parameters.");
+        return MOS_STATUS_NULL_POINTER;
+    }
+
+    renderHal = (PRENDERHAL_INTERFACE_LEGACY)MOS_AllocAndZeroMemory(sizeof(RENDERHAL_INTERFACE_LEGACY));
+    if (!renderHal)
+    {
+        MHW_RENDERHAL_ASSERTMESSAGE("Allocate render hal failed");
+        return MOS_STATUS_NULL_POINTER;
+    }
+
+    eStatus = RenderHal_InitInterface_Legacy(
+        (PRENDERHAL_INTERFACE_LEGACY)renderHal,
+        cpInterface,
+        osInterface);
+    if (eStatus != MOS_STATUS_SUCCESS)
+    {
+        MHW_RENDERHAL_ASSERTMESSAGE("Init render hal interface failed");
+        return MOS_STATUS_NULL_POINTER;
+    }
+
+    // Allocate and initialize HW states
+    renderHalSettings->iMediaStates = 32;
+    eStatus = renderHal->pfnInitialize(renderHal, renderHalSettings);
+    if (eStatus != MOS_STATUS_SUCCESS)
+    {
+        MHW_RENDERHAL_ASSERTMESSAGE("Init render hal failed");
+        return MOS_STATUS_NULL_POINTER;
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+//!
+//! \brief    Destroy Interface
+//! \details  Create RenderHal Interface structure, responsible for HW
+//!           abstraction of HW Rendering Engine for CM(MDF) and VP.
+//! \param    PRENDERHAL_INTERFACE_LEGACY renderHal
+//!           [in] Pointer to Hardware Interface Structure
+//!
+MOS_STATUS Destroy_RenderHal_Interface_Legacy(PRENDERHAL_INTERFACE_LEGACY renderHal)
+{
+    MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
+    if (renderHal)
+    {
+        eStatus = renderHal->pfnDestroy(renderHal);
+        if (eStatus != MOS_STATUS_SUCCESS)
+        {
+            MHW_RENDERHAL_ASSERTMESSAGE("Failed to destroy RenderHal, eStatus:%d.\n", eStatus);
+        }
+        MOS_FreeMemory(renderHal);
+
+    }
+
+    return eStatus;
+}
+
 //!
 //! \brief    Init Interface
 //! \details  Initializes RenderHal Interface structure, responsible for HW
diff --git a/media_driver/agnostic/common/renderhal/renderhal_legacy.h b/media_driver/agnostic/common/renderhal/renderhal_legacy.h
index 346b982f..eaf231be 100644
--- a/media_driver/agnostic/common/renderhal/renderhal_legacy.h
+++ b/media_driver/agnostic/common/renderhal/renderhal_legacy.h
@@ -97,6 +97,36 @@ typedef struct _RENDERHAL_INTERFACE_LEGACY : _RENDERHAL_INTERFACE
 
 } RENDERHAL_INTERFACE_LEGACY, *PRENDERHAL_INTERFACE_LEGACY;
 
+//!
+//! \brief    Create Interface
+//! \details  Create RenderHal Interface structure, responsible for HW
+//!           abstraction of HW Rendering Engine for CM(MDF) and VP.
+//! \param    PRENDERHAL_INTERFACE renderHal
+//!           [in/out] Pointer to Hardware Interface Structure
+//! \param    MhwCpInterface* cpInterface
+//!           [out] Pointer of pointer to MHW CP Interface Structure, which
+//!           is created during renderhal initialization
+//! \param    PMOS_INTERFACE osInterface
+//!           [in] Pointer to OS Interface Structure
+//! \param    PRENDERHAL_SETTINGS_LEGACY renderHalSettings
+//!           [in] Pointer to RenderHal Settings
+//!
+MOS_STATUS Create_RenderHal_Interface_Legacy(
+    PRENDERHAL_INTERFACE &renderHal,
+    MhwCpInterface       **cpInterface,
+    PMOS_INTERFACE       osInterface,
+    PRENDERHAL_SETTINGS_LEGACY renderHalSettings);
+
+//!
+//! \brief    Destroy Interface
+//! \details  Create RenderHal Interface structure, responsible for HW
+//!           abstraction of HW Rendering Engine for CM(MDF) and VP.
+//! \param    PRENDERHAL_INTERFACE_LEGACY renderHal
+//!           [in] Pointer to Hardware Interface Structure
+//!
+MOS_STATUS Destroy_RenderHal_Interface_Legacy(
+    PRENDERHAL_INTERFACE_LEGACY renderHal);
+
 //!
 //! \brief    Init Interface
 //! \details  Initializes Render Hal Interface structure, responsible for HW
diff --git a/media_driver/agnostic/common/shared/mediacopy/media_blt_copy.cpp b/media_driver/agnostic/common/shared/mediacopy/media_blt_copy.cpp
index 6eebede6..7a95c906 100644
--- a/media_driver/agnostic/common/shared/mediacopy/media_blt_copy.cpp
+++ b/media_driver/agnostic/common/shared/mediacopy/media_blt_copy.cpp
@@ -32,6 +32,7 @@
 #include "media_copy.h"
 #include "mhw_mi.h"
 #include "mos_utilities.h"
+#include "media_perf_profiler.h"
 #define BIT( n )                            ( 1 << (n) )
 
 //!
@@ -341,6 +342,10 @@ MOS_STATUS BltState::SubmitCMD(
     }
     planeNum = GetPlaneNum(dstResDetails.Format);
 
+    MediaPerfProfiler* perfProfiler = MediaPerfProfiler::Instance();
+    BLT_CHK_NULL_RETURN(perfProfiler);
+    BLT_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectStartCmd((void*)this, m_osInterface, m_miInterface, &cmdBuffer));
+
     if (pBltStateParam->bCopyMainSurface)
     {
         m_blokCopyon = true;
@@ -408,6 +413,8 @@ MOS_STATUS BltState::SubmitCMD(
               }
          }
     }
+
+    BLT_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectEndCmd((void*)this, m_osInterface, m_miInterface, &cmdBuffer));
     // Add flush DW
     BLT_CHK_STATUS_RETURN(m_miInterface->AddMiFlushDwCmd(&cmdBuffer, &FlushDwParams));
 
diff --git a/media_driver/agnostic/common/shared/mediacopy/media_vebox_copy.cpp b/media_driver/agnostic/common/shared/mediacopy/media_vebox_copy.cpp
index 2c579f9f..b47c4e05 100644
--- a/media_driver/agnostic/common/shared/mediacopy/media_vebox_copy.cpp
+++ b/media_driver/agnostic/common/shared/mediacopy/media_vebox_copy.cpp
@@ -239,6 +239,9 @@ MOS_STATUS VeboxCopyState::CopyMainSurface(PMOS_RESOURCE src, PMOS_RESOURCE dst)
     VEBOX_COPY_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
     VEBOX_COPY_CHK_STATUS_RETURN(InitCommandBuffer(&cmdBuffer));
 
+    MediaPerfProfiler* perfProfiler = MediaPerfProfiler::Instance();
+    VEBOX_COPY_CHK_NULL_RETURN(perfProfiler);
+    VEBOX_COPY_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectStartCmd((void*)this, m_osInterface, m_miInterface, &cmdBuffer));
     // Set Vebox Aux MMIO
     VEBOX_COPY_CHK_STATUS_RETURN(m_veboxInterface->setVeboxPrologCmd(m_miInterface, &cmdBuffer));
 
@@ -256,6 +259,7 @@ MOS_STATUS VeboxCopyState::CopyMainSurface(PMOS_RESOURCE src, PMOS_RESOURCE dst)
     // Send CMD: Vebox_Tiling_Convert
     //---------------------------------
     VEBOX_COPY_CHK_STATUS_RETURN(m_veboxInterface->AddVeboxTilingConvert(&cmdBuffer, &mhwVeboxSurfaceStateCmdParams.SurfInput, &mhwVeboxSurfaceStateCmdParams.SurfOutput));
+    VEBOX_COPY_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectEndCmd((void*)this, m_osInterface, m_miInterface, &cmdBuffer));
 
     MOS_ZeroMemory(&flushDwParams, sizeof(flushDwParams));
 
diff --git a/media_driver/agnostic/common/vp/hal/vphal_mdf_wrapper.cpp b/media_driver/agnostic/common/vp/hal/vphal_mdf_wrapper.cpp
index d5b60a31..c8636f9a 100644
--- a/media_driver/agnostic/common/vp/hal/vphal_mdf_wrapper.cpp
+++ b/media_driver/agnostic/common/vp/hal/vphal_mdf_wrapper.cpp
@@ -98,18 +98,19 @@ CmEvent* EventManager::GetLastEvent() const
     return mLastEvent;
 }
 
-CmContext::CmContext(PMOS_CONTEXT OsContext) :
+CmContext::CmContext(PMOS_INTERFACE osInterface) :
     mRefCount(0),
     mCmDevice(nullptr),
     mCmQueue(nullptr),
     mCmVebox(nullptr),
+    m_osInterface(osInterface),
     mBatchTask(nullptr),
     mHasBatchedTask(false),
     mConditionalBatchBuffer(nullptr),
     mCondParam({ 0 }),
     mEventListener(nullptr)
 {
-    VPHAL_RENDER_ASSERT(OsContext);
+    VPHAL_RENDER_CHK_NULL_NO_STATUS_RETURN(osInterface);
 
     const unsigned int MDF_DEVICE_CREATE_OPTION =
         ((CM_DEVICE_CREATE_OPTION_SCRATCH_SPACE_DISABLE)                                |
@@ -120,7 +121,7 @@ CmContext::CmContext(PMOS_CONTEXT OsContext) :
          (CM_DEVICE_CONFIG_GPUCONTEXT_ENABLE)                                           |
          (32 << CM_DEVICE_CONFIG_KERNELBINARYGSH_OFFSET));
 
-    int result = CreateCmDevice(OsContext, mCmDevice, MDF_DEVICE_CREATE_OPTION);
+    int result = osInterface->pfnCreateCmDevice(osInterface->pOsContext, mCmDevice, MDF_DEVICE_CREATE_OPTION, CM_DEVICE_CREATE_PRIORITY_DEFAULT);
     if (result != CM_SUCCESS)
     {
         VPHAL_RENDER_ASSERTMESSAGE("CmDevice creation error %d\n", result);
@@ -344,9 +345,9 @@ void CmContext::Destroy()
         mCmDevice->DestroyVebox(mCmVebox);
     }
 
-    if (mCmDevice)
+    if (mCmDevice && m_osInterface)
     {
-        DestroyCmDevice(mCmDevice);
+        m_osInterface->pfnDestroyCmDevice(mCmDevice);
     }
 
     mBatchTask = nullptr;
diff --git a/media_driver/agnostic/common/vp/hal/vphal_mdf_wrapper.h b/media_driver/agnostic/common/vp/hal/vphal_mdf_wrapper.h
index 7b3a3e5e..29d8fafe 100644
--- a/media_driver/agnostic/common/vp/hal/vphal_mdf_wrapper.h
+++ b/media_driver/agnostic/common/vp/hal/vphal_mdf_wrapper.h
@@ -81,7 +81,7 @@ public:
     // noncopyable
     CmContext(const CmContext&) = delete;
     CmContext& operator=(const CmContext&) = delete;
-    CmContext(PMOS_CONTEXT OsContext);
+    CmContext(PMOS_INTERFACE osInterface);
     virtual ~CmContext();
 
     void Destroy();
@@ -137,6 +137,7 @@ private:
     CmQueue   *mCmQueue;
     CmVebox   *mCmVebox;
 
+    PMOS_INTERFACE                m_osInterface = nullptr;
     CmTask                       *mBatchTask;
     std::vector<CmKernel *>       mAddedKernels;
     std::vector<CmKernel *>       mKernelsToPurge;
diff --git a/media_driver/agnostic/common/vp/hal/vphal_render_hdr_g11.cpp b/media_driver/agnostic/common/vp/hal/vphal_render_hdr_g11.cpp
index 3d228cc6..09b41a68 100644
--- a/media_driver/agnostic/common/vp/hal/vphal_render_hdr_g11.cpp
+++ b/media_driver/agnostic/common/vp/hal/vphal_render_hdr_g11.cpp
@@ -292,7 +292,7 @@ Hdr3DLutGenerator::Hdr3DLutGenerator(PRENDERHAL_INTERFACE renderHal, uint32_t *k
 {
     VPHAL_RENDER_CHK_NULL_NO_STATUS_RETURN(m_renderHal);
     VPHAL_RENDER_CHK_NULL_NO_STATUS_RETURN(m_renderHal->pOsInterface);
-    m_cmContext    = MOS_New(CmContext, m_renderHal->pOsInterface->pOsContext);
+    m_cmContext    = MOS_New(CmContext, m_renderHal->pOsInterface);
 
     VPHAL_RENDER_NORMALMESSAGE("Hdr3DLutGenerator Constructor!");
 
diff --git a/media_driver/agnostic/common/vp/hal/vphal_render_vebox_denoise.cpp b/media_driver/agnostic/common/vp/hal/vphal_render_vebox_denoise.cpp
index 9e2f2300..bc14d96e 100644
--- a/media_driver/agnostic/common/vp/hal/vphal_render_vebox_denoise.cpp
+++ b/media_driver/agnostic/common/vp/hal/vphal_render_vebox_denoise.cpp
@@ -136,7 +136,7 @@ VphalHVSDenoiser::VphalHVSDenoiser(PRENDERHAL_INTERFACE renderHal) :
 {
     VPHAL_RENDER_CHK_NULL_NO_STATUS_RETURN(m_renderHal);
     VPHAL_RENDER_CHK_NULL_NO_STATUS_RETURN(m_renderHal->pOsInterface);
-    m_cmContext    = MOS_New(CmContext, m_renderHal->pOsInterface->pOsContext);
+    m_cmContext    = MOS_New(CmContext, m_renderHal->pOsInterface);
     m_eventManager = MOS_New(EventManager, "HVSEventManager", m_cmContext);
     VPHAL_RENDER_NORMALMESSAGE("Constructor!");
 }
diff --git a/media_driver/agnostic/common/vp/hal/vphal_renderer.cpp b/media_driver/agnostic/common/vp/hal/vphal_renderer.cpp
index 2e738c93..cd045cf2 100644
--- a/media_driver/agnostic/common/vp/hal/vphal_renderer.cpp
+++ b/media_driver/agnostic/common/vp/hal/vphal_renderer.cpp
@@ -1006,6 +1006,8 @@ void VphalRenderer::UpdateReport(
         m_reporting->GetFeatures().rtCompressible = true;
         m_reporting->GetFeatures().rtCompressMode = (uint8_t)(pRenderParams->pTarget[0]->CompressionMode);
     }
+
+    m_reporting->GetFeatures().rtCacheSetting = (uint8_t)(pRenderParams->pTarget[0]->CacheSetting);
 }
 
 //!
diff --git a/media_driver/agnostic/gen11/cm/cm_hal_g11.cpp b/media_driver/agnostic/gen11/cm/cm_hal_g11.cpp
index 531a8141..81e262ec 100644
--- a/media_driver/agnostic/gen11/cm/cm_hal_g11.cpp
+++ b/media_driver/agnostic/gen11/cm/cm_hal_g11.cpp
@@ -748,7 +748,7 @@ MOS_STATUS CM_HAL_G11_X::SubmitCommands(
                 &mosSurface));
             mosSurface.OsResource = state->bufferTable[i].osResource;
 
-            CM_CHK_HRESULT_GOTOFINISH_MOSERROR(HalCm_SurfaceSync(state, &mosSurface, false));
+            CM_CHK_HRESULT_GOTOFINISH_MOSERROR(state->pfnSurfaceSync(state, &mosSurface, false));
         }
     }
 
diff --git a/media_driver/agnostic/gen12/cm/cm_hal_g12.cpp b/media_driver/agnostic/gen12/cm/cm_hal_g12.cpp
index a42e46a8..24cfb875 100644
--- a/media_driver/agnostic/gen12/cm/cm_hal_g12.cpp
+++ b/media_driver/agnostic/gen12/cm/cm_hal_g12.cpp
@@ -925,7 +925,7 @@ MOS_STATUS CM_HAL_G12_X::SubmitCommands(
                 &mosSurface));
             mosSurface.OsResource = state->bufferTable[i].osResource;
 
-            CM_CHK_HRESULT_GOTOFINISH_MOSERROR(HalCm_SurfaceSync(state, &mosSurface, false));
+            CM_CHK_HRESULT_GOTOFINISH_MOSERROR(state->pfnSurfaceSync(state, &mosSurface, false));
         }
     }
 
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_encode_hevc_mbenc_g12.cpp b/media_driver/agnostic/gen12/codec/hal/codechal_encode_hevc_mbenc_g12.cpp
index 1f9bb321..f1fed82a 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_encode_hevc_mbenc_g12.cpp
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_encode_hevc_mbenc_g12.cpp
@@ -390,11 +390,13 @@ MOS_STATUS CodecHalHevcMbencG12::AllocateMDFResources()
         //create CM device
         if (!m_cmDev)
         {
+            CODECHAL_ENCODE_CHK_NULL_RETURN(m_osInterface);
             m_osInterface->pfnNotifyStreamIndexSharing(m_osInterface);
-            CODECHAL_ENCODE_CHK_STATUS_RETURN(CreateCmDevice(
+            CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnCreateCmDevice(
                 m_osInterface->pOsContext,
                 m_cmDev,
-                devOp));
+                devOp,
+                CM_DEVICE_CREATE_PRIORITY_DEFAULT));
         }
 
         if (!m_surfIndexArray)
@@ -410,11 +412,13 @@ MOS_STATUS CodecHalHevcMbencG12::AllocateMDFResources()
         {
             if (!m_mfeEncodeSharedState->pCmDev)
             {
+                CODECHAL_ENCODE_CHK_NULL_RETURN(m_osInterface);
                 m_osInterface->pfnNotifyStreamIndexSharing(m_osInterface);
-                CODECHAL_ENCODE_CHK_STATUS_RETURN(CreateCmDevice(
+                CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnCreateCmDevice(
                     m_osInterface->pOsContext,
                     m_cmDev,
-                    devOp));
+                    devOp,
+                    CM_DEVICE_CREATE_PRIORITY_DEFAULT));
 
                 m_mfeEncodeSharedState->pCmDev = m_cmDev;
             }
@@ -474,9 +478,11 @@ MOS_STATUS CodecHalHevcMbencG12::DestroyMDFResources()
     {
         delete[] m_surfIndexArray;
         m_surfIndexArray = nullptr;
-
-        DestroyCmDevice(m_cmDev);
-        m_cmDev = nullptr;
+        if (m_osInterface != nullptr)
+        {
+            m_osInterface->pfnDestroyCmDevice(m_cmDev);
+            m_cmDev = nullptr;
+        }
     }
     else 
     {
@@ -488,9 +494,11 @@ MOS_STATUS CodecHalHevcMbencG12::DestroyMDFResources()
             delete[] m_surfIndexArray;
             m_surfIndexArray = nullptr;
             m_mfeEncodeSharedState->commonSurface = nullptr;
-
-            DestroyCmDevice(m_cmDev);
-            m_mfeEncodeSharedState->pCmDev = m_cmDev = nullptr;
+            if (m_osInterface != nullptr)
+            {
+                m_osInterface->pfnDestroyCmDevice(m_cmDev);
+                m_mfeEncodeSharedState->pCmDev = m_cmDev = nullptr;
+            }
         }
         else
         {
diff --git a/media_driver/agnostic/gen12/vp/hal/vphal_render_hdr_3dlut_g12.cpp b/media_driver/agnostic/gen12/vp/hal/vphal_render_hdr_3dlut_g12.cpp
index 3dc46bbb..513fe1fc 100644
--- a/media_driver/agnostic/gen12/vp/hal/vphal_render_hdr_3dlut_g12.cpp
+++ b/media_driver/agnostic/gen12/vp/hal/vphal_render_hdr_3dlut_g12.cpp
@@ -292,7 +292,7 @@ Hdr3DLutGeneratorG12::Hdr3DLutGeneratorG12(PRENDERHAL_INTERFACE renderHal, uint3
 {
     VPHAL_RENDER_CHK_NULL_NO_STATUS_RETURN(m_renderHal);
     VPHAL_RENDER_CHK_NULL_NO_STATUS_RETURN(m_renderHal->pOsInterface);
-    m_cmContext    = MOS_New(CmContext, m_renderHal->pOsInterface->pOsContext);
+    m_cmContext    = MOS_New(CmContext, m_renderHal->pOsInterface);
 
     VPHAL_RENDER_NORMALMESSAGE("Hdr3DLutGeneratorG12 Constructor!");
 
diff --git a/media_driver/agnostic/gen9/cm/cm_hal_g9.cpp b/media_driver/agnostic/gen9/cm/cm_hal_g9.cpp
index 3393bbf5..b460b637 100644
--- a/media_driver/agnostic/gen9/cm/cm_hal_g9.cpp
+++ b/media_driver/agnostic/gen9/cm/cm_hal_g9.cpp
@@ -1072,7 +1072,7 @@ MOS_STATUS CM_HAL_G9_X::SubmitCommands(
                         &mosSurface));
                 mosSurface.OsResource = state->bufferTable[i].osResource;
 
-                CM_CHK_HRESULT_GOTOFINISH_MOSERROR(HalCm_SurfaceSync(state, &mosSurface, false));
+                CM_CHK_HRESULT_GOTOFINISH_MOSERROR(state->pfnSurfaceSync(state, &mosSurface, false));
             }
         }
     }
diff --git a/media_driver/linux/common/cm/hal/cm_global_api_os.cpp b/media_driver/linux/common/cm/hal/cm_global_api_os.cpp
index 6960c570..3af3c013 100644
--- a/media_driver/linux/common/cm/hal/cm_global_api_os.cpp
+++ b/media_driver/linux/common/cm/hal/cm_global_api_os.cpp
@@ -45,8 +45,10 @@ using CMRT_UMD::CmDeviceRT;
 //!
 CM_RT_API int32_t CreateCmDevice(MOS_CONTEXT *mosContext,
                                  CmDevice* &device,
-                                 uint32_t devCreateOption)
+                                 uint32_t devCreateOption,
+                                 uint8_t  priority)
 {
+    UNUSED(priority);
     if (mosContext == nullptr)
     {
         return CM_NULL_POINTER;
@@ -91,3 +93,17 @@ CM_RT_API int32_t DestroyCmDevice(CmDevice* & device)
 
     return CM_SUCCESS;
 }
+
+//!
+//! \brief    Initialize cm hal ddi interfaces
+//! \details  Initialize cm hal ddi interfaces
+//! \param    cmState
+//!           [in,out] the pointer to the cm state.
+//! \return   MOS_STATUS
+//!           MOS_STATUS_SUCCESS if succeeded, otherwise error code
+//!
+MOS_STATUS InitCmOsDDIInterface(PCM_HAL_STATE cmState)
+{
+    UNUSED(cmState);
+    return MOS_STATUS_SUCCESS;
+}
diff --git a/media_driver/linux/common/cm/hal/cm_hal_os.cpp b/media_driver/linux/common/cm/hal/cm_hal_os.cpp
index 03e22b05..fd025595 100644
--- a/media_driver/linux/common/cm/hal/cm_hal_os.cpp
+++ b/media_driver/linux/common/cm/hal/cm_hal_os.cpp
@@ -284,7 +284,7 @@ MOS_STATUS HalCm_GetSurfaceAndRegister(
     }
 
     //Tag-based Sync on the Resource/surface
-    CM_CHK_MOSSTATUS_GOTOFINISH(HalCm_SyncOnResource(state, surface, true));
+    CM_CHK_MOSSTATUS_GOTOFINISH(state->pfnSyncOnResource(state, surface, true));
 
     eStatus = MOS_STATUS_SUCCESS;
 finish:
@@ -359,7 +359,7 @@ finish:
 //| Purpose:    Get 2D surface pitch and physical size for SURFACE2D_UP
 //| Returns:    Result of the operation.
 //*-----------------------------------------------------------------------------
-MOS_STATUS HalCm_GetSurface2DPitchAndSize_Linux(
+MOS_STATUS HalCm_GetSurface2DPitchAndSize(
     PCM_HAL_STATE                   state,                                             // [in]  Pointer to CM State
     PCM_HAL_SURFACE2D_UP_PARAM      param)                                             // [in]  Pointer to Buffer Param
 {
@@ -371,7 +371,7 @@ MOS_STATUS HalCm_GetSurface2DPitchAndSize_Linux(
 //| Purpose:    Register APP/Runtime-level created Event Handle as a UMD Object;
 //| Returns:    Result of the operation.
 //*-----------------------------------------------------------------------------
-MOS_STATUS HalCm_RegisterUMDNotifyEventHandle_Linux(
+MOS_STATUS HalCm_RegisterUMDNotifyEventHandle(
     PCM_HAL_STATE             state,
     PCM_HAL_OSSYNC_PARAM      syncParam)
 {
@@ -679,7 +679,7 @@ finish:
 //| Purpose:    Get GPU current frequency
 //| Returns:    Result of the operation.
 //*-----------------------------------------------------------------------------
-MOS_STATUS HalCm_GetGPUCurrentFrequency_Linux(
+MOS_STATUS HalCm_GetGPUCurrentFrequency(
     PCM_HAL_STATE               state,                                         // [in]  Pointer to CM State
     uint32_t                    *currentFrequency)                                   // [out] Pointer to current frequency
 {
@@ -693,7 +693,7 @@ MOS_STATUS HalCm_GetGPUCurrentFrequency_Linux(
     return MOS_STATUS_SUCCESS;
 }
 
-MOS_STATUS HalCm_GetGpuTime_Linux(PCM_HAL_STATE state, uint64_t *gpuTime)
+MOS_STATUS HalCm_GetGpuTime(PCM_HAL_STATE state, uint64_t *gpuTime)
 {
     UNUSED(state);
     *gpuTime = 0;
@@ -1186,12 +1186,12 @@ void HalCm_OsInitInterface(
 {
     CM_ASSERT(cmState);
 
-    cmState->pfnGetSurface2DPitchAndSize            = HalCm_GetSurface2DPitchAndSize_Linux;
-    cmState->pfnRegisterUMDNotifyEventHandle        = HalCm_RegisterUMDNotifyEventHandle_Linux;
+    cmState->pfnGetSurface2DPitchAndSize            = HalCm_GetSurface2DPitchAndSize;
+    cmState->pfnGetGPUCurrentFrequency              = HalCm_GetGPUCurrentFrequency;
+    cmState->pfnRegisterUMDNotifyEventHandle        = HalCm_RegisterUMDNotifyEventHandle;
     cmState->pfnAllocateBuffer                      = HalCm_AllocateBuffer_Linux;
     cmState->pfnAllocateSurface2DUP                 = HalCm_AllocateSurface2DUP_Linux;
-    cmState->pfnGetGPUCurrentFrequency              = HalCm_GetGPUCurrentFrequency_Linux;
-    cmState->pfnGetGpuTime                          = HalCm_GetGpuTime_Linux;
+    cmState->pfnGetGpuTime                          = HalCm_GetGpuTime;
     cmState->pfnGetPlatformInfo                     = HalCm_GetPlatformInfo_Linux;
     cmState->pfnGetGTSystemInfo                     = HalCm_GetGTSystemInfo_Linux;
     cmState->pfnReferenceCommandBuffer              = HalCm_ReferenceCommandBuf_Linux;
@@ -1202,6 +1202,14 @@ void HalCm_OsInitInterface(
     cmState->pfnUpdateTrackerResource               = HalCm_UpdateTrackerResource_Linux;
     cmState->pfnRegisterStream                      = HalCm_RegisterStream;
 
+    cmState->pfnGetGfxMapFilter                     = HalCm_GetGfxMapFilter;
+    cmState->pfnGetGfxTextAddress                   = HalCm_GetGfxTextAddress;
+    cmState->pfnDecompressSurface                   = HalCm_DecompressSurface;
+    cmState->pfnSetOsResourceFromDdi                = HalCm_SetOsResourceFromDdi;
+    cmState->pfnGetSipBinary                        = HalCm_GetSipBinary;
+    cmState->pfnSurfaceSync                         = HalCm_SurfaceSync;
+    cmState->pfnSyncKernel                          = HalCm_SyncKernel;
+
     HalCm_GetLibDrmVMapFnt(cmState);
     cmState->syncOnResource                         = false;
     return;
@@ -1598,3 +1606,27 @@ MOS_STATUS HalCm_SurfaceSync(
 
     return MOS_STATUS_SUCCESS;
 }
+
+//!
+//! \brief    initialization os resource from DDI
+//! \details  initialization os resource from DDI
+//! \param    PMOS_RESOURCE pResource
+//!           [in] Pointer to OS Resource
+//! \param    PMOS_RESOURCE pOsResource
+//!           [out] Pointer to OS Resource
+//! \param    UINT MipSlice
+//!           [in] Slice info
+//! \return   MOS_STATUS
+//!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
+//!
+MOS_STATUS HalCm_SetOsResourceFromDdi(
+    PMOS_RESOURCE     resource,
+    PMOS_RESOURCE     osResource,
+    uint32_t          mipSlice)
+{
+    UNUSED(resource);
+    UNUSED(osResource);
+    UNUSED(mipSlice);
+
+    return MOS_STATUS_SUCCESS;
+}
diff --git a/media_driver/linux/common/cm/hal/cm_wrapper_os.cpp b/media_driver/linux/common/cm/hal/cm_wrapper_os.cpp
index 64d4bbd3..66578800 100644
--- a/media_driver/linux/common/cm/hal/cm_wrapper_os.cpp
+++ b/media_driver/linux/common/cm/hal/cm_wrapper_os.cpp
@@ -26,7 +26,7 @@
 //!
 
 #include "cm_wrapper.h"
-
+#include "cm_rt_umd.h"
 #include "cm_device_rt.h"
 #include "cm_surface_2d_rt.h"
 #include "media_libva_util.h"
diff --git a/media_driver/linux/common/codec/ddi/media_ddi_decode_av1.cpp b/media_driver/linux/common/codec/ddi/media_ddi_decode_av1.cpp
index 30b6128d..cf982fef 100644
--- a/media_driver/linux/common/codec/ddi/media_ddi_decode_av1.cpp
+++ b/media_driver/linux/common/codec/ddi/media_ddi_decode_av1.cpp
@@ -227,11 +227,16 @@ VAStatus DdiDecodeAV1::ParsePicParams(
         if (picParam->ref_frame_map[i] < mediaCtx->uiNumSurfaces)
         {
             frameIdx = GetRenderTargetID(&m_ddiDecodeCtx->RTtbl, refSurface);
-            if (frameIdx == DDI_CODEC_INVALID_FRAME_INDEX) {
-                return VA_STATUS_ERROR_INVALID_PARAMETER;
+       
+            if ((frameIdx == DDI_CODEC_INVALID_FRAME_INDEX) && 
+                (picParam->pic_info_fields.bits.frame_type != keyFrame) && 
+                (picParam->pic_info_fields.bits.frame_type != intraOnlyFrame))
+            {
+                 return VA_STATUS_ERROR_INVALID_PARAMETER;
             }
-            picAV1Params->m_refFrameMap[i].FrameIdx = ((uint32_t)frameIdx >= CODECHAL_NUM_UNCOMPRESSED_SURFACE_VP9) ?
-                                                      (CODECHAL_NUM_UNCOMPRESSED_SURFACE_VP9 - 1) : frameIdx;
+
+            picAV1Params->m_refFrameMap[i].FrameIdx = ((uint32_t)frameIdx >= CODECHAL_NUM_UNCOMPRESSED_SURFACE_AV1) ?
+                                                      (CODECHAL_NUM_UNCOMPRESSED_SURFACE_AV1 - 1) : frameIdx;
         }
         else
         {
@@ -240,17 +245,17 @@ VAStatus DdiDecodeAV1::ParsePicParams(
                 frameIdx = GetRenderTargetID(&m_ddiDecodeCtx->RTtbl, refSurface);
                 if (frameIdx != DDI_CODEC_INVALID_FRAME_INDEX)
                 {
-                    picAV1Params->m_refFrameMap[i].FrameIdx = ((uint32_t)frameIdx >= CODECHAL_NUM_UNCOMPRESSED_SURFACE_VP9) ?
-                                                              (CODECHAL_NUM_UNCOMPRESSED_SURFACE_VP9 - 1) : frameIdx;
+                    picAV1Params->m_refFrameMap[i].FrameIdx = ((uint32_t)frameIdx >= CODECHAL_NUM_UNCOMPRESSED_SURFACE_AV1) ?
+                                                              (CODECHAL_NUM_UNCOMPRESSED_SURFACE_AV1 - 1) : frameIdx;
                 }
                 else
                 {
-                    picAV1Params->m_refFrameMap[i].FrameIdx = CODECHAL_NUM_UNCOMPRESSED_SURFACE_VP9 - 1;
+                    picAV1Params->m_refFrameMap[i].FrameIdx = CODECHAL_NUM_UNCOMPRESSED_SURFACE_AV1 - 1;
                 }
             }
             else
             {
-                picAV1Params->m_refFrameMap[i].FrameIdx = CODECHAL_NUM_UNCOMPRESSED_SURFACE_VP9 - 1;
+                picAV1Params->m_refFrameMap[i].FrameIdx = CODECHAL_NUM_UNCOMPRESSED_SURFACE_AV1 - 1;
             }
         }
     }
diff --git a/media_driver/linux/common/cp/ddi/media_ddi_prot.cpp b/media_driver/linux/common/cp/ddi/media_ddi_prot.cpp
index e6ea1c19..7546df05 100644
--- a/media_driver/linux/common/cp/ddi/media_ddi_prot.cpp
+++ b/media_driver/linux/common/cp/ddi/media_ddi_prot.cpp
@@ -333,10 +333,17 @@ void DdiMedia_FreeProtectedSessionHeap(
     for (int32_t elementId = 0; ctxNums > 0  && elementId < contextHeap->uiAllocatedHeapElements; ++elementId)
     {
         PDDI_MEDIA_VACONTEXT_HEAP_ELEMENT mediaContextHeapElmt = &mediaContextHeapBase[elementId];
-        if (nullptr != mediaContextHeapElmt && nullptr == mediaContextHeapElmt->pVaContext)
-            continue;
-        VAContextID vaCtxID = (VAContextID)(mediaContextHeapElmt->uiVaContextID + vaContextOffset);
-        DdiMediaProtected::DdiMedia_DestroyProtectedSession(ctx, vaCtxID);
+        if (nullptr != mediaContextHeapElmt)
+        {
+            if (nullptr == mediaContextHeapElmt->pVaContext)
+                continue;
+            VAContextID vaCtxID = (VAContextID)(mediaContextHeapElmt->uiVaContextID + vaContextOffset);
+            DdiMediaProtected::DdiMedia_DestroyProtectedSession(ctx, vaCtxID);
+        }
+        else
+        {
+            DDI_ASSERTMESSAGE("DDI: Invalid mediaContextHeapElmt");
+        }
         ctxNums--;
     }
 }
diff --git a/media_driver/linux/common/ddi/media_libva.cpp b/media_driver/linux/common/ddi/media_libva.cpp
index f48ea910..29f4e688 100755
--- a/media_driver/linux/common/ddi/media_libva.cpp
+++ b/media_driver/linux/common/ddi/media_libva.cpp
@@ -777,7 +777,7 @@ static void DdiMedia_FreeSurfaceHeapElements(PDDI_MEDIA_CONTEXT mediaCtx)
     for (int32_t elementId = 0; surfaceNums > 0 && elementId < surfaceHeap->uiAllocatedHeapElements; elementId++)
     {
         PDDI_MEDIA_SURFACE_HEAP_ELEMENT mediaSurfaceHeapElmt = &mediaSurfaceHeapBase[elementId];
-        if (nullptr != mediaSurfaceHeapElmt && nullptr == mediaSurfaceHeapElmt->pSurface)
+        if (nullptr == mediaSurfaceHeapElmt->pSurface)
             continue;
 
         DdiMediaUtil_FreeSurface(mediaSurfaceHeapElmt->pSurface);
@@ -813,7 +813,7 @@ static void DdiMedia_FreeBufferHeapElements(VADriverContextP    ctx)
     for (int32_t elementId = 0; bufNums > 0 && elementId < bufferHeap->uiAllocatedHeapElements; ++elementId)
     {
         PDDI_MEDIA_BUFFER_HEAP_ELEMENT mediaBufferHeapElmt = &mediaBufferHeapBase[elementId];
-        if (nullptr != mediaBufferHeapElmt && nullptr == mediaBufferHeapElmt->pBuffer)
+        if (nullptr == mediaBufferHeapElmt->pBuffer)
             continue;
         //Note: uiNumBufs will recount in DdiMedia_DestroyBuffer
         DdiMedia_DestroyBuffer(ctx,mediaBufferHeapElmt->uiVaBufferID);
@@ -847,7 +847,7 @@ static void DdiMedia_FreeImageHeapElements(VADriverContextP    ctx)
     for (int32_t elementId = 0; imageNums > 0 && elementId < imageHeap->uiAllocatedHeapElements; ++elementId)
     {
         PDDI_MEDIA_IMAGE_HEAP_ELEMENT mediaImageHeapElmt = &mediaImageHeapBase[elementId];
-        if (nullptr != mediaImageHeapElmt && nullptr == mediaImageHeapElmt->pImage)
+        if (nullptr == mediaImageHeapElmt->pImage)
             continue;
         //Note: uiNumImages will recount in DdiMedia_DestroyImage
         DdiMedia_DestroyImage(ctx,mediaImageHeapElmt->uiVaImageID);
@@ -872,7 +872,7 @@ static void DdiMedia_FreeContextHeap(VADriverContextP ctx, PDDI_MEDIA_HEAP conte
     for (int32_t elementId = 0; ctxNums > 0 && elementId < contextHeap->uiAllocatedHeapElements; ++elementId)
     {
         PDDI_MEDIA_VACONTEXT_HEAP_ELEMENT mediaContextHeapElmt = &mediaContextHeapBase[elementId];
-        if (nullptr != mediaContextHeapElmt && nullptr == mediaContextHeapElmt->pVaContext)
+        if (nullptr == mediaContextHeapElmt->pVaContext)
             continue;
         VAContextID vaCtxID = (VAContextID)(mediaContextHeapElmt->uiVaContextID + vaContextOffset);
         DdiMedia_DestroyContext(ctx,vaCtxID);
diff --git a/media_driver/linux/common/os/mos_os_specific.c b/media_driver/linux/common/os/mos_os_specific.c
index 69dc58de..8e3a53cc 100644
--- a/media_driver/linux/common/os/mos_os_specific.c
+++ b/media_driver/linux/common/os/mos_os_specific.c
@@ -66,6 +66,15 @@
 #include "mos_oca_interface_specific.h"
 #include "mos_os_next.h"
 
+extern int32_t CreateCmDevice(MOS_CONTEXT *mosContext,
+                              CMRT_UMD::CmDevice* &device,
+                              uint32_t devCreateOption,
+                              uint8_t  priority);
+
+extern int32_t DestroyCmDevice(CMRT_UMD::CmDevice* &device);
+
+extern MOS_STATUS InitCmOsDDIInterface(PCM_HAL_STATE cmState);
+
 //!
 //! \brief DRM VMAP patch
 //!
@@ -7128,6 +7137,11 @@ MOS_STATUS Mos_Specific_InitInterface(
     pOsInterface->pfnVirtualEngineInit                      = Mos_Specific_Virtual_Engine_Init;
     pOsInterface->pfnDestroyVeInterface                     = Mos_Specific_DestroyVeInterface;
     pOsInterface->pfnVirtualEngineInterfaceInitialize       = Mos_VirtualEngineInterface_Initialize;
+
+    pOsInterface->pfnCreateCmDevice                         = CreateCmDevice;
+    pOsInterface->pfnDestroyCmDevice                        = DestroyCmDevice;
+    pOsInterface->pfnInitCmInterface                        = InitCmOsDDIInterface;
+
 #if (_DEBUG || _RELEASE_INTERNAL)
     pOsInterface->pfnGetEngineLogicId                       = Mos_Specific_GetEngineLogicId;
 #endif
diff --git a/media_driver/linux/common/vp/ddi/media_libva_vp_tools.c b/media_driver/linux/common/vp/ddi/media_libva_vp_tools.c
index 03c86764..cb33c2d8 100644
--- a/media_driver/linux/common/vp/ddi/media_libva_vp_tools.c
+++ b/media_driver/linux/common/vp/ddi/media_libva_vp_tools.c
@@ -641,6 +641,7 @@ void VpConfigValuesInit(
     pConfigValues->dwScalerCompressModeReported  = LIBVA_VP_CONFIG_NOT_REPORTED;
     pConfigValues->dwPrimaryCompressibleReported = LIBVA_VP_CONFIG_NOT_REPORTED;
     pConfigValues->dwPrimaryCompressModeReported = LIBVA_VP_CONFIG_NOT_REPORTED;
+    pConfigValues->dwRTCacheSettingReported      = LIBVA_VP_CONFIG_NOT_REPORTED;
 }
 
 void VpFeatureReport(
@@ -697,6 +698,12 @@ void VpFeatureReport(
         __VPHAL_RT_MMC_COMPRESSIBLE,
         pConfig->dwRTCompressible,
         MediaUserSetting::Group::Sequence);
+    //VP RT Cache Usage
+    ReportUserSettingForDebug(
+        userSettingPtr,
+        __VPHAL_RT_Cache_Setting,
+        pConfig->dwRTCacheSetting,
+        MediaUserSetting::Group::Sequence);
 #endif
 #endif //(_DEBUG || _RELEASE_INTERNAL)
 }
diff --git a/media_driver/media_interface/media_interfaces_dg2/media_interfaces_dg2.cpp b/media_driver/media_interface/media_interfaces_dg2/media_interfaces_dg2.cpp
index 073a362b..8790986d 100644
--- a/media_driver/media_interface/media_interfaces_dg2/media_interfaces_dg2.cpp
+++ b/media_driver/media_interface/media_interfaces_dg2/media_interfaces_dg2.cpp
@@ -78,7 +78,8 @@ Register<VphalInterfacesXe_Hpm>((uint32_t)IGFX_DG2);
 MOS_STATUS VphalInterfacesXe_Hpm::Initialize(
     PMOS_INTERFACE  osInterface,
     bool            bInitVphalState,
-    MOS_STATUS      *eStatus)
+    MOS_STATUS      *eStatus,
+    bool            clearViewMode)
 {
     bool bApogeiosEnable = true;
     MOS_USER_FEATURE_VALUE_DATA         UserFeatureData;
diff --git a/media_driver/media_interface/media_interfaces_dg2/media_interfaces_dg2.h b/media_driver/media_interface/media_interfaces_dg2/media_interfaces_dg2.h
index ca703655..c2ed3fc7 100644
--- a/media_driver/media_interface/media_interfaces_dg2/media_interfaces_dg2.h
+++ b/media_driver/media_interface/media_interfaces_dg2/media_interfaces_dg2.h
@@ -374,7 +374,8 @@ public:
     MOS_STATUS Initialize(
         PMOS_INTERFACE  osInterface,
         bool            bInitVphalState,
-        MOS_STATUS      *eStatus);
+        MOS_STATUS      *eStatus,
+        bool            clearViewMode = false);
         
     MOS_STATUS CreateVpPlatformInterface(
         PMOS_INTERFACE           osInterface,
diff --git a/media_driver/media_interface/media_interfaces_m10_cnl/media_interfaces_g10_cnl.cpp b/media_driver/media_interface/media_interfaces_m10_cnl/media_interfaces_g10_cnl.cpp
index 98f7fdc7..ac515a02 100644
--- a/media_driver/media_interface/media_interfaces_m10_cnl/media_interfaces_g10_cnl.cpp
+++ b/media_driver/media_interface/media_interfaces_m10_cnl/media_interfaces_g10_cnl.cpp
@@ -47,7 +47,8 @@ static bool cnlRegisteredVphal =
 MOS_STATUS VphalInterfacesG10Cnl::Initialize(
     PMOS_INTERFACE  osInterface,
     bool            bInitVphalState,
-    MOS_STATUS      *eStatus)
+    MOS_STATUS      *eStatus,
+    bool            clearViewMode)
 {
     m_vpBase = MOS_New(
         VphalState,
diff --git a/media_driver/media_interface/media_interfaces_m10_cnl/media_interfaces_g10_cnl.h b/media_driver/media_interface/media_interfaces_m10_cnl/media_interfaces_g10_cnl.h
index ab328108..4489cdbe 100644
--- a/media_driver/media_interface/media_interfaces_m10_cnl/media_interfaces_g10_cnl.h
+++ b/media_driver/media_interface/media_interfaces_m10_cnl/media_interfaces_g10_cnl.h
@@ -250,7 +250,8 @@ public:
     MOS_STATUS Initialize(
         PMOS_INTERFACE  osInterface,
         bool            bInitVphalState,
-        MOS_STATUS      *eStatus);
+        MOS_STATUS      *eStatus,
+        bool            clearViewMode = false);
 };
 
 class RenderHalInterfacesG10Cnl : public RenderHalDevice
diff --git a/media_driver/media_interface/media_interfaces_m11_icllp/media_interfaces_g11_icllp.cpp b/media_driver/media_interface/media_interfaces_m11_icllp/media_interfaces_g11_icllp.cpp
index 8d6db46f..072de7cf 100644
--- a/media_driver/media_interface/media_interfaces_m11_icllp/media_interfaces_g11_icllp.cpp
+++ b/media_driver/media_interface/media_interfaces_m11_icllp/media_interfaces_g11_icllp.cpp
@@ -48,7 +48,8 @@ Register<VphalInterfacesG11Icllp>((uint32_t)IGFX_ICELAKE_LP);
 MOS_STATUS VphalInterfacesG11Icllp::Initialize(
     PMOS_INTERFACE  osInterface,
     bool            bInitVphalState,
-    MOS_STATUS      *eStatus)
+    MOS_STATUS      *eStatus,
+    bool            clearViewMode)
 {
     m_vpBase = MOS_New(
         VphalState,
diff --git a/media_driver/media_interface/media_interfaces_m11_icllp/media_interfaces_g11_icllp.h b/media_driver/media_interface/media_interfaces_m11_icllp/media_interfaces_g11_icllp.h
index bfde8a41..316f2181 100644
--- a/media_driver/media_interface/media_interfaces_m11_icllp/media_interfaces_g11_icllp.h
+++ b/media_driver/media_interface/media_interfaces_m11_icllp/media_interfaces_g11_icllp.h
@@ -251,7 +251,8 @@ public:
     MOS_STATUS Initialize(
         PMOS_INTERFACE  osInterface,
         bool            bInitVphalState,
-        MOS_STATUS      *eStatus);
+        MOS_STATUS      *eStatus,
+        bool            clearViewMode = false);
 };
 
 class RenderHalInterfacesG11Icllp : public RenderHalDevice
diff --git a/media_driver/media_interface/media_interfaces_m11_jsl_ehl/media_interfaces_g11_jsl_ehl.cpp b/media_driver/media_interface/media_interfaces_m11_jsl_ehl/media_interfaces_g11_jsl_ehl.cpp
index 4552f4fd..5a466fa6 100644
--- a/media_driver/media_interface/media_interfaces_m11_jsl_ehl/media_interfaces_g11_jsl_ehl.cpp
+++ b/media_driver/media_interface/media_interfaces_m11_jsl_ehl/media_interfaces_g11_jsl_ehl.cpp
@@ -48,7 +48,8 @@ Register<VphalInterfacesG11JslEhl>((uint32_t)IGFX_JASPERLAKE);
 MOS_STATUS VphalInterfacesG11JslEhl::Initialize(
     PMOS_INTERFACE  osInterface,
     bool            bInitVphalState,
-    MOS_STATUS      *eStatus)
+    MOS_STATUS      *eStatus,
+    bool            clearViewMode)
 {
     m_vpBase = MOS_New(
         VphalState,
diff --git a/media_driver/media_interface/media_interfaces_m11_jsl_ehl/media_interfaces_g11_jsl_ehl.h b/media_driver/media_interface/media_interfaces_m11_jsl_ehl/media_interfaces_g11_jsl_ehl.h
index a3eb3760..4c2f1bc1 100644
--- a/media_driver/media_interface/media_interfaces_m11_jsl_ehl/media_interfaces_g11_jsl_ehl.h
+++ b/media_driver/media_interface/media_interfaces_m11_jsl_ehl/media_interfaces_g11_jsl_ehl.h
@@ -208,7 +208,8 @@ public:
     MOS_STATUS Initialize(
         PMOS_INTERFACE  osInterface,
         bool            bInitVphalState,
-        MOS_STATUS      *eStatus);
+        MOS_STATUS      *eStatus,
+        bool            clearViewMode = false);
 };
 
 class RenderHalInterfacesG11JslEhl : public RenderHalDevice
diff --git a/media_driver/media_interface/media_interfaces_m12_tgllp/media_interfaces_g12_tgllp.cpp b/media_driver/media_interface/media_interfaces_m12_tgllp/media_interfaces_g12_tgllp.cpp
index 3b5abc3a..7a9cf575 100644
--- a/media_driver/media_interface/media_interfaces_m12_tgllp/media_interfaces_g12_tgllp.cpp
+++ b/media_driver/media_interface/media_interfaces_m12_tgllp/media_interfaces_g12_tgllp.cpp
@@ -49,7 +49,8 @@ Register<VphalInterfacesG12Tgllp>((uint32_t)IGFX_TIGERLAKE_LP);
 MOS_STATUS VphalInterfacesG12Tgllp::Initialize(
     PMOS_INTERFACE  osInterface,
     bool            bInitVphalState,
-    MOS_STATUS      *eStatus)
+    MOS_STATUS      *eStatus,
+    bool            clearViewMode)
 {
     MOS_OS_CHK_NULL_RETURN(eStatus);
     MOS_OS_CHK_NULL_RETURN(osInterface);
diff --git a/media_driver/media_interface/media_interfaces_m12_tgllp/media_interfaces_g12_tgllp.h b/media_driver/media_interface/media_interfaces_m12_tgllp/media_interfaces_g12_tgllp.h
index 33aa7037..2bf16ea9 100644
--- a/media_driver/media_interface/media_interfaces_m12_tgllp/media_interfaces_g12_tgllp.h
+++ b/media_driver/media_interface/media_interfaces_m12_tgllp/media_interfaces_g12_tgllp.h
@@ -310,7 +310,8 @@ public:
     MOS_STATUS Initialize(
         PMOS_INTERFACE  osInterface,
         bool            bInitVphalState,
-        MOS_STATUS      *eStatus);
+        MOS_STATUS      *eStatus,
+        bool            clearViewMode = false);
 
     MOS_STATUS CreateVpPlatformInterface(
         PMOS_INTERFACE osInterface,
diff --git a/media_driver/media_interface/media_interfaces_m8_bdw/media_interfaces_g8_bdw.cpp b/media_driver/media_interface/media_interfaces_m8_bdw/media_interfaces_g8_bdw.cpp
index f3842f2a..d9b663cb 100644
--- a/media_driver/media_interface/media_interfaces_m8_bdw/media_interfaces_g8_bdw.cpp
+++ b/media_driver/media_interface/media_interfaces_m8_bdw/media_interfaces_g8_bdw.cpp
@@ -51,7 +51,8 @@ static bool bdwRegisteredVphal =
 MOS_STATUS VphalInterfacesG8Bdw::Initialize(
     PMOS_INTERFACE  osInterface,
     bool            bInitVphalState,
-    MOS_STATUS      *eStatus)
+    MOS_STATUS      *eStatus,
+    bool            clearViewMode)
 {
     m_vpBase = MOS_New(
         VphalState,
diff --git a/media_driver/media_interface/media_interfaces_m8_bdw/media_interfaces_g8_bdw.h b/media_driver/media_interface/media_interfaces_m8_bdw/media_interfaces_g8_bdw.h
index f6a5c360..ec765cb1 100644
--- a/media_driver/media_interface/media_interfaces_m8_bdw/media_interfaces_g8_bdw.h
+++ b/media_driver/media_interface/media_interfaces_m8_bdw/media_interfaces_g8_bdw.h
@@ -178,7 +178,8 @@ public:
     MOS_STATUS Initialize(
         PMOS_INTERFACE  osInterface,
         bool            bInitVphalState,
-        MOS_STATUS      *eStatus);
+        MOS_STATUS      *eStatus,
+        bool            clearViewMode = false);
 };
 
 class RenderHalInterfacesG8Bdw : public RenderHalDevice
diff --git a/media_driver/media_interface/media_interfaces_m9_bxt/media_interfaces_g9_bxt.cpp b/media_driver/media_interface/media_interfaces_m9_bxt/media_interfaces_g9_bxt.cpp
index 1ecb1947..3f306ee2 100644
--- a/media_driver/media_interface/media_interfaces_m9_bxt/media_interfaces_g9_bxt.cpp
+++ b/media_driver/media_interface/media_interfaces_m9_bxt/media_interfaces_g9_bxt.cpp
@@ -45,7 +45,8 @@ static bool bxtRegisteredVphal =
 MOS_STATUS VphalInterfacesG9Bxt::Initialize(
     PMOS_INTERFACE  osInterface,
     bool            bInitVphalState,
-    MOS_STATUS      *eStatus)
+    MOS_STATUS      *eStatus,
+    bool            clearViewMode)
 {
     m_vpBase = MOS_New(
         VphalState,
diff --git a/media_driver/media_interface/media_interfaces_m9_bxt/media_interfaces_g9_bxt.h b/media_driver/media_interface/media_interfaces_m9_bxt/media_interfaces_g9_bxt.h
index cb3973b6..dab920c3 100644
--- a/media_driver/media_interface/media_interfaces_m9_bxt/media_interfaces_g9_bxt.h
+++ b/media_driver/media_interface/media_interfaces_m9_bxt/media_interfaces_g9_bxt.h
@@ -238,7 +238,8 @@ public:
     MOS_STATUS Initialize(
         PMOS_INTERFACE  osInterface,
         bool            bInitVphalState,
-        MOS_STATUS      *eStatus);
+        MOS_STATUS      *eStatus,
+        bool            clearViewMode = false);
 };
 
 class DecodeHistogramDeviceG9Bxt : public DecodeHistogramDevice
diff --git a/media_driver/media_interface/media_interfaces_m9_glk/media_interfaces_g9_glk.cpp b/media_driver/media_interface/media_interfaces_m9_glk/media_interfaces_g9_glk.cpp
index 8a9cdbf7..de81e609 100644
--- a/media_driver/media_interface/media_interfaces_m9_glk/media_interfaces_g9_glk.cpp
+++ b/media_driver/media_interface/media_interfaces_m9_glk/media_interfaces_g9_glk.cpp
@@ -50,7 +50,8 @@ static bool glkRegisteredVphal =
 MOS_STATUS VphalInterfacesG9Glk::Initialize(
     PMOS_INTERFACE  osInterface,
     bool            bInitVphalState,
-    MOS_STATUS      *eStatus)
+    MOS_STATUS      *eStatus,
+    bool            clearViewMode)
 {
     m_vpBase = MOS_New(
         VphalState,
diff --git a/media_driver/media_interface/media_interfaces_m9_glk/media_interfaces_g9_glk.h b/media_driver/media_interface/media_interfaces_m9_glk/media_interfaces_g9_glk.h
index a7d84319..b93124f6 100644
--- a/media_driver/media_interface/media_interfaces_m9_glk/media_interfaces_g9_glk.h
+++ b/media_driver/media_interface/media_interfaces_m9_glk/media_interfaces_g9_glk.h
@@ -66,7 +66,8 @@ public:
     MOS_STATUS Initialize(
         PMOS_INTERFACE  osInterface,
         bool            bInitVphalState,
-        MOS_STATUS      *eStatus);
+        MOS_STATUS      *eStatus,
+        bool            clearViewMode = false);
 };
 
 class CodechalEncodeInterfacesG9Glk
diff --git a/media_driver/media_interface/media_interfaces_m9_kbl/media_interfaces_g9_kbl.cpp b/media_driver/media_interface/media_interfaces_m9_kbl/media_interfaces_g9_kbl.cpp
index e07ce690..99d78618 100644
--- a/media_driver/media_interface/media_interfaces_m9_kbl/media_interfaces_g9_kbl.cpp
+++ b/media_driver/media_interface/media_interfaces_m9_kbl/media_interfaces_g9_kbl.cpp
@@ -45,7 +45,8 @@ static bool kblRegisteredVphal =
 MOS_STATUS VphalInterfacesG9Kbl::Initialize(
     PMOS_INTERFACE  osInterface,
     bool            bInitVphalState,
-    MOS_STATUS      *eStatus)
+    MOS_STATUS      *eStatus,
+    bool            clearViewMode)
 {
     m_vpBase = MOS_New(
         VphalState,
diff --git a/media_driver/media_interface/media_interfaces_m9_kbl/media_interfaces_g9_kbl.h b/media_driver/media_interface/media_interfaces_m9_kbl/media_interfaces_g9_kbl.h
index ea81074f..fb99be46 100644
--- a/media_driver/media_interface/media_interfaces_m9_kbl/media_interfaces_g9_kbl.h
+++ b/media_driver/media_interface/media_interfaces_m9_kbl/media_interfaces_g9_kbl.h
@@ -237,7 +237,8 @@ public:
     MOS_STATUS Initialize(
         PMOS_INTERFACE  osInterface,
         bool            bInitVphalState,
-        MOS_STATUS      *eStatus);
+        MOS_STATUS      *eStatus,
+        bool            clearViewMode = false);
 };
 
 class RenderHalInterfacesG9Kbl : public RenderHalDevice
diff --git a/media_driver/media_interface/media_interfaces_m9_skl/media_interfaces_g9_skl.cpp b/media_driver/media_interface/media_interfaces_m9_skl/media_interfaces_g9_skl.cpp
index 3249f145..e2520edf 100644
--- a/media_driver/media_interface/media_interfaces_m9_skl/media_interfaces_g9_skl.cpp
+++ b/media_driver/media_interface/media_interfaces_m9_skl/media_interfaces_g9_skl.cpp
@@ -53,7 +53,8 @@ static bool sklRegisteredVphal =
 MOS_STATUS VphalInterfacesG9Skl::Initialize(
     PMOS_INTERFACE  osInterface,
     bool            bInitVphalState,
-    MOS_STATUS      *eStatus)
+    MOS_STATUS      *eStatus,
+    bool            clearViewMode)
 {
     m_vpBase = MOS_New(
         VphalState,
diff --git a/media_driver/media_interface/media_interfaces_m9_skl/media_interfaces_g9_skl.h b/media_driver/media_interface/media_interfaces_m9_skl/media_interfaces_g9_skl.h
index 72ebb08e..27ceeb05 100644
--- a/media_driver/media_interface/media_interfaces_m9_skl/media_interfaces_g9_skl.h
+++ b/media_driver/media_interface/media_interfaces_m9_skl/media_interfaces_g9_skl.h
@@ -240,7 +240,8 @@ public:
     MOS_STATUS Initialize(
         PMOS_INTERFACE  osInterface,
         bool            bInitVphalState,
-        MOS_STATUS      *eStatus);
+        MOS_STATUS      *eStatus,
+        bool            clearViewMode = false);
 };
 
 class RenderHalInterfacesG9Skl : public RenderHalDevice
diff --git a/media_driver/media_interface/media_interfaces_pvc/media_interfaces_pvc.cpp b/media_driver/media_interface/media_interfaces_pvc/media_interfaces_pvc.cpp
index ca3fdd31..612f4a40 100644
--- a/media_driver/media_interface/media_interfaces_pvc/media_interfaces_pvc.cpp
+++ b/media_driver/media_interface/media_interfaces_pvc/media_interfaces_pvc.cpp
@@ -56,7 +56,8 @@ Register<VphalInterfacesXe_Xpm_Plus>((uint32_t)IGFX_PVC);
 MOS_STATUS VphalInterfacesXe_Xpm_Plus::Initialize(
     PMOS_INTERFACE  osInterface,
     bool            bInitVphalState,
-    MOS_STATUS      *eStatus)
+    MOS_STATUS      *eStatus,
+    bool            clearViewMode)
 {
     m_vpBase = MOS_New(
         VphalState,
diff --git a/media_driver/media_interface/media_interfaces_pvc/media_interfaces_pvc.h b/media_driver/media_interface/media_interfaces_pvc/media_interfaces_pvc.h
index 07f99e9e..800a4764 100644
--- a/media_driver/media_interface/media_interfaces_pvc/media_interfaces_pvc.h
+++ b/media_driver/media_interface/media_interfaces_pvc/media_interfaces_pvc.h
@@ -348,7 +348,8 @@ public:
     MOS_STATUS Initialize(
         PMOS_INTERFACE  osInterface,
         bool            bInitVphalState,
-        MOS_STATUS      *eStatus);
+        MOS_STATUS      *eStatus,
+        bool            clearViewMode = false);
 };
 
 class RenderHalInterfacesXe_Hpc : public RenderHalDevice
diff --git a/media_driver/media_interface/media_interfaces_xehp_sdv/media_interfaces_xehp_sdv.cpp b/media_driver/media_interface/media_interfaces_xehp_sdv/media_interfaces_xehp_sdv.cpp
index abcf5082..f3d0f4c6 100644
--- a/media_driver/media_interface/media_interfaces_xehp_sdv/media_interfaces_xehp_sdv.cpp
+++ b/media_driver/media_interface/media_interfaces_xehp_sdv/media_interfaces_xehp_sdv.cpp
@@ -64,7 +64,8 @@ Register<VphalInterfacesXe_Xpm>((uint32_t)IGFX_XE_HP_SDV);
 MOS_STATUS VphalInterfacesXe_Xpm::Initialize(
     PMOS_INTERFACE  osInterface,
     bool            bInitVphalState,
-    MOS_STATUS      *eStatus)
+    MOS_STATUS      *eStatus,
+    bool            clearViewMode)
 {
     MOS_OS_CHK_NULL_RETURN(osInterface);
     bool bApogeiosEnable = true;
diff --git a/media_driver/media_interface/media_interfaces_xehp_sdv/media_interfaces_xehp_sdv.h b/media_driver/media_interface/media_interfaces_xehp_sdv/media_interfaces_xehp_sdv.h
index d9d2d646..03be27a8 100644
--- a/media_driver/media_interface/media_interfaces_xehp_sdv/media_interfaces_xehp_sdv.h
+++ b/media_driver/media_interface/media_interfaces_xehp_sdv/media_interfaces_xehp_sdv.h
@@ -304,7 +304,8 @@ public:
     MOS_STATUS Initialize(
         PMOS_INTERFACE  osInterface,
         bool            bInitVphalState,
-        MOS_STATUS      *eStatus);
+        MOS_STATUS      *eStatus,
+        bool            clearViewMode = false);
 
     MOS_STATUS CreateVpPlatformInterface(
         PMOS_INTERFACE           osInterface,
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_HPM/shared/mediacopy/media_blt_copy_xe_hpm.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_HPM/shared/mediacopy/media_blt_copy_xe_hpm.cpp
index 95a860bc..5b92210d 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_HPM/shared/mediacopy/media_blt_copy_xe_hpm.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_HPM/shared/mediacopy/media_blt_copy_xe_hpm.cpp
@@ -32,6 +32,7 @@
 #include "mos_os.h"
 #include "mos_util_debug.h"
 #include "mos_utilities.h"
+#include "media_perf_profiler.h"
 class MhwInterfaces;
 
 //!
@@ -614,7 +615,6 @@ MOS_STATUS BltState_Xe_Hpm::SetupCtrlSurfCopyBltParam(
 MOS_STATUS BltState_Xe_Hpm::SubmitCMD(
     PBLT_STATE_PARAM pBltStateParam)
 {
-    MOS_STATUS                   eStatus = MOS_STATUS_SUCCESS;
     MOS_COMMAND_BUFFER           cmdBuffer;
     MHW_FAST_COPY_BLT_PARAM      fastCopyBltParam;
     MHW_CTRL_SURF_COPY_BLT_PARAM ctrlSurfCopyBltParam;
@@ -622,7 +622,7 @@ MOS_STATUS BltState_Xe_Hpm::SubmitCMD(
     int                          planeNum = 1;
     PMHW_BLT_INTERFACE_XE_HP     pbltInterface = dynamic_cast<PMHW_BLT_INTERFACE_XE_HP>(m_bltInterface);
 
-    BLT_CHK_NULL(pbltInterface);
+    BLT_CHK_NULL_RETURN(pbltInterface);
 
     // no gpucontext will be created if the gpu context has been created before.
     BLT_CHK_STATUS_RETURN(m_osInterface->pfnCreateGpuContext(
@@ -653,6 +653,9 @@ MOS_STATUS BltState_Xe_Hpm::SubmitCMD(
     }
     planeNum = GetPlaneNum(dstResDetails.Format);
 
+    MediaPerfProfiler* perfProfiler = MediaPerfProfiler::Instance();
+    BLT_CHK_NULL_RETURN(perfProfiler);
+    BLT_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectStartCmd((void*)this, m_osInterface, m_miInterface, &cmdBuffer));
     if (pBltStateParam->bCopyMainSurface)
     {
         BLT_CHK_STATUS_RETURN(SetupBltCopyParam(
@@ -730,6 +733,7 @@ MOS_STATUS BltState_Xe_Hpm::SubmitCMD(
             &cmdBuffer,
             &ctrlSurfCopyBltParam));
     }
+    BLT_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectEndCmd((void*)this, m_osInterface, m_miInterface, &cmdBuffer));
 
     // Add flush DW
     MHW_MI_FLUSH_DW_PARAMS FlushDwParams;
@@ -742,8 +746,7 @@ MOS_STATUS BltState_Xe_Hpm::SubmitCMD(
     // Flush the command buffer
     BLT_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, false));
 
-finish:
-    return eStatus;
+    return MOS_STATUS_SUCCESS;
 }
 
 MOS_STATUS BltState_Xe_Hpm::CopyMainSurface(
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/avc/pipeline/decode_avc_pipeline_m12.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/avc/pipeline/decode_avc_pipeline_m12.cpp
index e703b419..6b12fd07 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/avc/pipeline/decode_avc_pipeline_m12.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/avc/pipeline/decode_avc_pipeline_m12.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2018-2021, Intel Corporation
+* Copyright (c) 2018-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -318,7 +318,7 @@ MOS_STATUS AvcPipelineM12::Prepare(void *params)
                 if (downSamplingFeature != nullptr)
                 {
                     auto frameIdx = m_basicFeature->m_curRenderPic.FrameIdx;
-                    inputParameters.sfcOutputPicRes = &downSamplingFeature->m_outputSurfaceList[frameIdx].OsResource;
+                    inputParameters.sfcOutputSurface = &downSamplingFeature->m_outputSurfaceList[frameIdx];
                     DumpDownSamplingParams(*downSamplingFeature);
                 });
 #endif
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/hevc/pipeline/decode_hevc_pipeline_m12.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/hevc/pipeline/decode_hevc_pipeline_m12.cpp
index 81753c6d..acb1b64c 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/hevc/pipeline/decode_hevc_pipeline_m12.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/hevc/pipeline/decode_hevc_pipeline_m12.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2018-2022, Intel Corporation
+* Copyright (c) 2018-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -345,7 +345,7 @@ MOS_STATUS HevcPipelineM12::Prepare(void *params)
             if (downSamplingFeature != nullptr)
             {
                 auto frameIdx = m_basicFeature->m_curRenderPic.FrameIdx;
-                inputParameters.sfcOutputPicRes = &downSamplingFeature->m_outputSurfaceList[frameIdx].OsResource;
+                inputParameters.sfcOutputSurface = &downSamplingFeature->m_outputSurfaceList[frameIdx];
                 if (downSamplingFeature->m_histogramBuffer != nullptr)
                 {
                     inputParameters.histogramOutputBuf = &downSamplingFeature->m_histogramBuffer->OsResource;
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/jpeg/packet/decode_jpeg_packet_m12.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/jpeg/packet/decode_jpeg_packet_m12.cpp
index f5e6687e..0d1bb185 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/jpeg/packet/decode_jpeg_packet_m12.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/jpeg/packet/decode_jpeg_packet_m12.cpp
@@ -50,7 +50,6 @@ MOS_STATUS JpegDecodePktM12::Submit(
         m_jpegBasicFeature->m_width, m_jpegBasicFeature->m_height, false));
 
     DECODE_CHK_STATUS(Mos_Solo_PreProcessDecode(m_osInterface, &m_jpegBasicFeature->m_destSurface));
-    SetPerfTag(m_jpegBasicFeature->m_mode, m_jpegBasicFeature->m_pictureCodingType);
 
     if (IsPrologRequired())
     {
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/jpeg/packet/decode_jpeg_xe_m_base_packet.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/jpeg/packet/decode_jpeg_xe_m_base_packet.cpp
index d276286e..2e115643 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/jpeg/packet/decode_jpeg_xe_m_base_packet.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/jpeg/packet/decode_jpeg_xe_m_base_packet.cpp
@@ -82,7 +82,9 @@ void JpegDecodePktXe_M_Base::SetPerfTag(CODECHAL_MODE mode, uint16_t picCodingTy
     DECODE_FUNC_CALL();
 
     uint16_t perfTag = ((mode << 4) & 0xF0) | (picCodingType & 0xF);
+    m_osInterface->pfnIncPerfFrameID(m_osInterface);
     m_osInterface->pfnSetPerfTag(m_osInterface, perfTag);
+    m_osInterface->pfnResetPerfBufferID(m_osInterface);
 }
 
 bool JpegDecodePktXe_M_Base::IsPrologRequired()
@@ -241,7 +243,8 @@ MOS_STATUS JpegDecodePktXe_M_Base::StartStatusReport(uint32_t srType, MOS_COMMAN
 
     DECODE_CHK_STATUS(MediaPacket::StartStatusReport(srType, cmdBuffer));
 
-    SetPerfTag(CODECHAL_DECODE_MODE_JPEG, m_jpegBasicFeature->m_pictureCodingType);
+    // no frame type for Jpeg decode, use I as default value here
+    SetPerfTag(CODECHAL_DECODE_MODE_JPEG, I_TYPE);
 
     MediaPerfProfiler* perfProfiler = MediaPerfProfiler::Instance();
     DECODE_CHK_NULL(perfProfiler);
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/jpeg/pipeline/decode_jpeg_pipeline_m12.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/jpeg/pipeline/decode_jpeg_pipeline_m12.cpp
index 5c5f64e5..ace8d340 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/jpeg/pipeline/decode_jpeg_pipeline_m12.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/jpeg/pipeline/decode_jpeg_pipeline_m12.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2021, Intel Corporation
+* Copyright (c) 2021-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -279,7 +279,7 @@ MOS_STATUS JpegPipelineM12::Prepare(void *params)
             if (downSamplingFeature != nullptr)
             {
                 auto frameIdx                   = m_basicFeature->m_curRenderPic.FrameIdx;
-                inputParameters.sfcOutputPicRes = &downSamplingFeature->m_outputSurfaceList[frameIdx].OsResource;
+                inputParameters.sfcOutputSurface = &downSamplingFeature->m_outputSurfaceList[frameIdx];
                 CODECHAL_DEBUG_TOOL(DumpDownSamplingParams(*downSamplingFeature));
             }
 #endif
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/vp9/pipeline/decode_vp9_pipeline_m12.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/vp9/pipeline/decode_vp9_pipeline_m12.cpp
index 12656dd2..2ea478aa 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/vp9/pipeline/decode_vp9_pipeline_m12.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/vp9/pipeline/decode_vp9_pipeline_m12.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2020-2021, Intel Corporation
+* Copyright (c) 2020-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -125,7 +125,7 @@ MOS_STATUS Vp9PipelineG12::Prepare(void *params)
             if (downSamplingFeature != nullptr)
             {
                 auto frameIdx                   = m_basicFeature->m_curRenderPic.FrameIdx;
-                inputParameters.sfcOutputPicRes = &downSamplingFeature->m_outputSurfaceList[frameIdx].OsResource;
+                inputParameters.sfcOutputSurface = &downSamplingFeature->m_outputSurfaceList[frameIdx];
                 if (downSamplingFeature->m_histogramBuffer != nullptr)
                 {
                     inputParameters.histogramOutputBuf = &downSamplingFeature->m_histogramBuffer->OsResource;
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/shared/mediacopy/media_blt_copy_xe_xpm_base.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/shared/mediacopy/media_blt_copy_xe_xpm_base.cpp
index 5ab6c7e6..42178b54 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/shared/mediacopy/media_blt_copy_xe_xpm_base.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/shared/mediacopy/media_blt_copy_xe_xpm_base.cpp
@@ -646,7 +646,6 @@ MOS_STATUS BltStateXe_Xpm::SetupCtrlSurfCopyBltParam(
 MOS_STATUS BltStateXe_Xpm::SubmitCMD(
     PBLT_STATE_PARAM pBltStateParam)
 {
-    MOS_STATUS                   eStatus = MOS_STATUS_SUCCESS;
     MOS_COMMAND_BUFFER           cmdBuffer;
     MHW_FAST_COPY_BLT_PARAM      fastCopyBltParam;
     MHW_CTRL_SURF_COPY_BLT_PARAM ctrlSurfCopyBltParam;
@@ -654,7 +653,7 @@ MOS_STATUS BltStateXe_Xpm::SubmitCMD(
     int                          planeNum = 1;
     PMHW_BLT_INTERFACE_XE_HP     pbltInterface = dynamic_cast<PMHW_BLT_INTERFACE_XE_HP>(m_bltInterface);
 
-    BLT_CHK_NULL(pbltInterface);
+    BLT_CHK_NULL_RETURN(pbltInterface);
 
     // no gpucontext will be created if the gpu context has been created before.
     BLT_CHK_STATUS_RETURN(m_osInterface->pfnCreateGpuContext(
@@ -683,6 +682,10 @@ MOS_STATUS BltStateXe_Xpm::SubmitCMD(
     }
     planeNum = GetPlaneNum(dstResDetails.Format);
 
+    MediaPerfProfiler* perfProfiler = MediaPerfProfiler::Instance();
+    BLT_CHK_NULL_RETURN(perfProfiler);
+    BLT_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectStartCmd((void*)this, m_osInterface, m_miInterface, &cmdBuffer));
+
     if (pBltStateParam->bCopyMainSurface)
     {
         BLT_CHK_STATUS_RETURN(SetupBltCopyParam(
@@ -760,7 +763,7 @@ MOS_STATUS BltStateXe_Xpm::SubmitCMD(
             &cmdBuffer,
             &ctrlSurfCopyBltParam));
     }
-
+    BLT_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectEndCmd((void*)this, m_osInterface, m_miInterface, &cmdBuffer));
     // Add flush DW
     MHW_MI_FLUSH_DW_PARAMS FlushDwParams;
     MOS_ZeroMemory(&FlushDwParams, sizeof(FlushDwParams));
@@ -772,8 +775,8 @@ MOS_STATUS BltStateXe_Xpm::SubmitCMD(
     // Flush the command buffer
     BLT_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, false));
 
-finish:
-    return eStatus;
+
+    return MOS_STATUS_SUCCESS;
 }
 
 MOS_STATUS BltStateXe_Xpm::CopyMainSurface(
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_plus/shared/mediacopy/media_blt_copy_xe_xpm_plus.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_plus/shared/mediacopy/media_blt_copy_xe_xpm_plus.cpp
index 393c791c..a01ec99c 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_plus/shared/mediacopy/media_blt_copy_xe_xpm_plus.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_plus/shared/mediacopy/media_blt_copy_xe_xpm_plus.cpp
@@ -481,7 +481,6 @@ MOS_STATUS BltStateXe_Xpm_Plus::SetupCtrlSurfCopyBltParam(
 MOS_STATUS BltStateXe_Xpm_Plus::SubmitCMD(
     PBLT_STATE_PARAM pBltStateParam)
 {
-    MOS_STATUS                   eStatus = MOS_STATUS_SUCCESS;
     MOS_COMMAND_BUFFER           cmdBuffer;
     MHW_FAST_COPY_BLT_PARAM      fastCopyBltParam;
     MHW_CTRL_SURF_COPY_BLT_PARAM ctrlSurfCopyBltParam;
@@ -489,7 +488,7 @@ MOS_STATUS BltStateXe_Xpm_Plus::SubmitCMD(
     int                          planeNum = 1;
     PMHW_BLT_INTERFACE_XE_HPC    pbltInterface = dynamic_cast<PMHW_BLT_INTERFACE_XE_HPC>(m_bltInterface);
 
-    BLT_CHK_NULL(pbltInterface);
+    BLT_CHK_NULL_RETURN(pbltInterface);
 
     // no gpucontext will be created if the gpu context has been created before.
     BLT_CHK_STATUS_RETURN(m_osInterface->pfnCreateGpuContext(
@@ -518,6 +517,10 @@ MOS_STATUS BltStateXe_Xpm_Plus::SubmitCMD(
     }
     planeNum = GetPlaneNum(dstResDetails.Format);
 
+    MediaPerfProfiler* perfProfiler = MediaPerfProfiler::Instance();
+    BLT_CHK_NULL_RETURN(perfProfiler);
+    BLT_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectStartCmd((void*)this, m_osInterface, m_miInterface, &cmdBuffer));
+
     if (pBltStateParam->bCopyMainSurface)
     {
         BLT_CHK_STATUS_RETURN(SetupBltCopyParam(
@@ -596,6 +599,8 @@ MOS_STATUS BltStateXe_Xpm_Plus::SubmitCMD(
         //    &ctrlSurfCopyBltParam));
     }
 
+    BLT_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectEndCmd((void*)this, m_osInterface, m_miInterface, &cmdBuffer));
+
     // Add flush DW
     MHW_MI_FLUSH_DW_PARAMS FlushDwParams;
     MOS_ZeroMemory(&FlushDwParams, sizeof(FlushDwParams));
@@ -607,8 +612,7 @@ MOS_STATUS BltStateXe_Xpm_Plus::SubmitCMD(
     // Flush the command buffer
     BLT_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, false));
 
-finish:
-    return eStatus;
+    return MOS_STATUS_SUCCESS;
 }
 
 MOS_STATUS BltStateXe_Xpm_Plus::CopyMainSurface(
diff --git a/media_driver/media_softlet/agnostic/Xe_R/Xe_HP_Base/renderhal/renderhal_xe_hp_base.cpp b/media_driver/media_softlet/agnostic/Xe_R/Xe_HP_Base/renderhal/renderhal_xe_hp_base.cpp
index 1cc0b8db..60742202 100644
--- a/media_driver/media_softlet/agnostic/Xe_R/Xe_HP_Base/renderhal/renderhal_xe_hp_base.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_R/Xe_HP_Base/renderhal/renderhal_xe_hp_base.cpp
@@ -105,7 +105,7 @@ MOS_STATUS XRenderHal_Interface_Xe_Hp_Base::SetupSurfaceState(
     MHW_RENDERHAL_CHK_NULL(pRenderHal->pStateHeap);
     MHW_RENDERHAL_CHK_NULL(pRenderHal->pHwSizes);
     MHW_RENDERHAL_CHK_NULL(pRenderHal->pMhwStateHeap);
-    MHW_RENDERHAL_ASSERT(pRenderHalSurface->Rotation >= 0 && pRenderHalSurface->Rotation < 8);
+    MHW_RENDERHAL_ASSERT(pRenderHalSurface->Rotation >= MHW_ROTATION_IDENTITY && pRenderHalSurface->Rotation <= MHW_ROTATE_90_MIRROR_HORIZONTAL);
     //-----------------------------------------
 
     dwSurfaceSize = pRenderHal->pHwSizes->dwSizeSurfaceState;
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus/vp/hal/platform_interface/vp_platform_interface_xe_lpm_plus.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus/vp/hal/platform_interface/vp_platform_interface_xe_lpm_plus.cpp
index 4bb62944..73e86c40 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus/vp/hal/platform_interface/vp_platform_interface_xe_lpm_plus.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus/vp/hal/platform_interface/vp_platform_interface_xe_lpm_plus.cpp
@@ -39,8 +39,8 @@ using namespace vp;
 extern const Kdll_RuleEntry         g_KdllRuleTable_Next[];
 #define VEBOX_KERNEL_BASE_MAX_G13 2
 
-VpPlatformInterfacesXe_Lpm_Plus::VpPlatformInterfacesXe_Lpm_Plus(PMOS_INTERFACE pOsInterface)
-    : VpPlatformInterface(pOsInterface)
+VpPlatformInterfacesXe_Lpm_Plus::VpPlatformInterfacesXe_Lpm_Plus(PMOS_INTERFACE pOsInterface, bool clearViewMode)
+    : VpPlatformInterface(pOsInterface, clearViewMode)
 {
     bool defaultValue = 0;
     // get dithering flag.
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus/vp/hal/platform_interface/vp_platform_interface_xe_lpm_plus.h b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus/vp/hal/platform_interface/vp_platform_interface_xe_lpm_plus.h
index 2e121a3d..fdb5121c 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus/vp/hal/platform_interface/vp_platform_interface_xe_lpm_plus.h
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus/vp/hal/platform_interface/vp_platform_interface_xe_lpm_plus.h
@@ -46,7 +46,7 @@ class VpPlatformInterfacesXe_Lpm_Plus : public VpPlatformInterface
 {
 public:
 
-    VpPlatformInterfacesXe_Lpm_Plus(PMOS_INTERFACE pOsInterface);
+    VpPlatformInterfacesXe_Lpm_Plus(PMOS_INTERFACE pOsInterface, bool clearViewMode = false);
 
     virtual ~VpPlatformInterfacesXe_Lpm_Plus()
     {}
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/av1/pipeline/decode_av1_pipeline_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/av1/pipeline/decode_av1_pipeline_xe_lpm_plus_base.cpp
index 4442d6a4..96b082c4 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/av1/pipeline/decode_av1_pipeline_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/av1/pipeline/decode_av1_pipeline_xe_lpm_plus_base.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2020-2021, Intel Corporation
+* Copyright (c) 2020-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -139,7 +139,7 @@ namespace decode
                         m_featureManager->GetFeature(DecodeFeatureIDs::decodeDownSampling));
                     if (downSamplingFeature != nullptr) {
                         auto frameIdx                   = basicFeature->m_curRenderPic.FrameIdx;
-                        inputParameters.sfcOutputPicRes = &downSamplingFeature->m_outputSurfaceList[frameIdx].OsResource;
+                        inputParameters.sfcOutputSurface = &downSamplingFeature->m_outputSurfaceList[frameIdx];
                         DumpDownSamplingParams(*downSamplingFeature);
                     });
 #endif
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/avc/pipeline/decode_avc_pipeline_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/avc/pipeline/decode_avc_pipeline_xe_lpm_plus_base.cpp
index 5ee9cad3..1c2e8e92 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/avc/pipeline/decode_avc_pipeline_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/avc/pipeline/decode_avc_pipeline_xe_lpm_plus_base.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2021, Intel Corporation
+* Copyright (c) 2021-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -213,7 +213,7 @@ MOS_STATUS AvcPipelineXe_Lpm_Plus_Base::Prepare(void *params)
                 if (downSamplingFeature != nullptr)
                 {
                     auto frameIdx = m_basicFeature->m_curRenderPic.FrameIdx;
-                    inputParameters.sfcOutputPicRes = &downSamplingFeature->m_outputSurfaceList[frameIdx].OsResource;
+                    inputParameters.sfcOutputSurface = &downSamplingFeature->m_outputSurfaceList[frameIdx];
                     DumpDownSamplingParams(*downSamplingFeature);
                 });
 #endif
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/hevc/pipeline/decode_hevc_pipeline_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/hevc/pipeline/decode_hevc_pipeline_xe_lpm_plus_base.cpp
index 16d948f2..ed4b77a1 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/hevc/pipeline/decode_hevc_pipeline_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/hevc/pipeline/decode_hevc_pipeline_xe_lpm_plus_base.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2021-2022, Intel Corporation
+* Copyright (c) 2021-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -255,7 +255,7 @@ MOS_STATUS HevcPipelineXe_Lpm_Plus_Base::Prepare(void *params)
             if (downSamplingFeature != nullptr)
             {
                 auto frameIdx = m_basicFeature->m_curRenderPic.FrameIdx;
-                inputParameters.sfcOutputPicRes = &downSamplingFeature->m_outputSurfaceList[frameIdx].OsResource;
+                inputParameters.sfcOutputSurface = &downSamplingFeature->m_outputSurfaceList[frameIdx];
                 if (downSamplingFeature->m_histogramBuffer != nullptr)
                 {
                     inputParameters.histogramOutputBuf = &downSamplingFeature->m_histogramBuffer->OsResource;
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/jpeg/packet/decode_jpeg_packet_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/jpeg/packet/decode_jpeg_packet_xe_lpm_plus_base.cpp
index 5ea9ea33..bc2ba735 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/jpeg/packet/decode_jpeg_packet_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/jpeg/packet/decode_jpeg_packet_xe_lpm_plus_base.cpp
@@ -50,7 +50,6 @@ MOS_STATUS JpegDecodePktXe_Lpm_Plus_Base::Submit(
         m_jpegBasicFeature->m_width, m_jpegBasicFeature->m_height, false));
 
     DECODE_CHK_STATUS(Mos_Solo_PreProcessDecode(m_osInterface, &m_jpegBasicFeature->m_destSurface));
-    SetPerfTag(m_jpegBasicFeature->m_mode, m_jpegBasicFeature->m_pictureCodingType);
 
     if (IsPrologRequired())
     {
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/jpeg/pipeline/decode_jpeg_pipeline_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/jpeg/pipeline/decode_jpeg_pipeline_xe_lpm_plus_base.cpp
index 7e1b255f..da40f48d 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/jpeg/pipeline/decode_jpeg_pipeline_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/jpeg/pipeline/decode_jpeg_pipeline_xe_lpm_plus_base.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2021, Intel Corporation
+* Copyright (c) 2021-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -199,7 +199,7 @@ MOS_STATUS JpegPipelineXe_Lpm_Plus_Base::Prepare(void *params)
             if (downSamplingFeature != nullptr)
             {
                 auto frameIdx                   = m_basicFeature->m_curRenderPic.FrameIdx;
-                inputParameters.sfcOutputPicRes = &downSamplingFeature->m_outputSurfaceList[frameIdx].OsResource;
+                inputParameters.sfcOutputSurface = &downSamplingFeature->m_outputSurfaceList[frameIdx];
                 CODECHAL_DEBUG_TOOL(DumpDownSamplingParams(*downSamplingFeature));
             }
 #endif
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/vp9/pipeline/decode_vp9_pipeline_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/vp9/pipeline/decode_vp9_pipeline_xe_lpm_plus_base.cpp
index 53be550b..fdbe23fe 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/vp9/pipeline/decode_vp9_pipeline_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/vp9/pipeline/decode_vp9_pipeline_xe_lpm_plus_base.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2020-2022, Intel Corporation
+* Copyright (c) 2020-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -111,7 +111,7 @@ MOS_STATUS Vp9PipelineXe_Lpm_Plus_Base::Prepare(void *params)
             if (downSamplingFeature != nullptr)
             {
                 auto frameIdx                   = m_basicFeature->m_curRenderPic.FrameIdx;
-                inputParameters.sfcOutputPicRes = &downSamplingFeature->m_outputSurfaceList[frameIdx].OsResource;
+                inputParameters.sfcOutputSurface = &downSamplingFeature->m_outputSurfaceList[frameIdx];
                 if (downSamplingFeature->m_histogramBuffer != nullptr)
                 {
                     inputParameters.histogramOutputBuf = &downSamplingFeature->m_histogramBuffer->OsResource;
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/avc/pipeline/encode_avc_vdenc_pipeline_adapter_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/avc/pipeline/encode_avc_vdenc_pipeline_adapter_xe_lpm_plus_base.cpp
index 273dbdfd..760a16fa 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/avc/pipeline/encode_avc_vdenc_pipeline_adapter_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/avc/pipeline/encode_avc_vdenc_pipeline_adapter_xe_lpm_plus_base.cpp
@@ -36,3 +36,10 @@ MOS_STATUS EncodeAvcVdencPipelineAdapterXe_Lpm_Plus_Base::Allocate(CodechalSetti
 
     return m_encoder->Init(codecHalSettings);
 }
+
+MOS_STATUS EncodeAvcVdencPipelineAdapterXe_Lpm_Plus_Base::ResolveMetaData(PMOS_RESOURCE pInput, PMOS_RESOURCE pOutput)
+{
+    ENCODE_FUNC_CALL();
+
+    return m_encoder->ExecuteResolveMetaData(pInput, pOutput);
+}
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/avc/pipeline/encode_avc_vdenc_pipeline_adapter_xe_lpm_plus_base.h b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/avc/pipeline/encode_avc_vdenc_pipeline_adapter_xe_lpm_plus_base.h
index 754cf944..74751f13 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/avc/pipeline/encode_avc_vdenc_pipeline_adapter_xe_lpm_plus_base.h
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/avc/pipeline/encode_avc_vdenc_pipeline_adapter_xe_lpm_plus_base.h
@@ -40,6 +40,8 @@ public:
 
     virtual MOS_STATUS Allocate(CodechalSetting *codecHalSettings) override;
 
+    virtual MOS_STATUS ResolveMetaData(PMOS_RESOURCE pInput, PMOS_RESOURCE pOutput) override;
+
 MEDIA_CLASS_DEFINE_END(EncodeAvcVdencPipelineAdapterXe_Lpm_Plus_Base)
 };
 
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/vp9/packet/encode_vp9_vdenc_packet_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/vp9/packet/encode_vp9_vdenc_packet_xe_lpm_plus_base.cpp
index 51f3b816..a1f8d9b0 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/vp9/packet/encode_vp9_vdenc_packet_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/vp9/packet/encode_vp9_vdenc_packet_xe_lpm_plus_base.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2020-2022, Intel Corporation
+* Copyright (c) 2020-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -196,6 +196,7 @@ MOS_STATUS Vp9VdencPktXe_Lpm_Plus_Base::AddPictureVdencCommands(MOS_COMMAND_BUFF
     ENCODE_CHK_STATUS_RETURN(AddVdencSurfacesStateCmd(cmdBuffer));
     // Add vdenc pipeline buffer address command
     ENCODE_CHK_STATUS_RETURN(AddVdencPipeBufAddrCmd(cmdBuffer));
+
     // Add second level batch buffer command
     ENCODE_CHK_STATUS_RETURN(AddVdencSecondLevelBatchBufferCmd(cmdBuffer));
 
@@ -306,6 +307,14 @@ MOS_STATUS Vp9VdencPktXe_Lpm_Plus_Base::PatchPictureLevelCommands(MOS_COMMAND_BU
         {
             m_vdencPakObjCmdStreamOutEnabled = false;
         }
+
+        if (!m_basicFeature->m_hucEnabled)
+        {
+            // Construct picture state 2nd level batch buffer
+            RUN_FEATURE_INTERFACE_RETURN(Vp9EncodePak, Vp9FeatureIDs::vp9PakFeature, ConstructPicStateBatchBuffer, m_pipeline);
+            // Refresh internal bufferes
+            RUN_FEATURE_INTERFACE_RETURN(Vp9EncodeHpu, Vp9FeatureIDs::vp9HpuFeature, RefreshFrameInternalBuffers);
+        }
     }
 
     ENCODE_CHK_STATUS_RETURN(AddCondBBEndForLastPass(cmdBuffer));
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediacopy/media_blt_copy_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediacopy/media_blt_copy_xe_lpm_plus_base.cpp
index 02ced837..1baf0297 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediacopy/media_blt_copy_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediacopy/media_blt_copy_xe_lpm_plus_base.cpp
@@ -27,7 +27,7 @@
 
 #include "media_blt_copy_xe_lpm_plus_base.h"
 #include "mhw_cp_interface.h"
-
+#include "media_perf_profiler.h"
 //!
 //! \brief    BltStateXe_Xpm_Plus constructor
 //! \details  Initialize the BltStateXe_Xpm_Plus members.
@@ -560,6 +560,10 @@ MOS_STATUS BltStateXe_Lpm_Plus_Base::SubmitCMD(
     }
     planeNum = GetPlaneNum(dstResDetails.Format);
 
+    MediaPerfProfiler* perfProfiler = MediaPerfProfiler::Instance();
+    BLT_CHK_NULL_RETURN(perfProfiler);
+    BLT_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectStartCmd((void*)this, m_osInterface, m_miItf, &cmdBuffer));
+
     if (pBltStateParam->bCopyMainSurface)
     {
         BLT_CHK_STATUS_RETURN(SetupBltCopyParam(
@@ -653,18 +657,7 @@ MOS_STATUS BltStateXe_Lpm_Plus_Base::SubmitCMD(
             }
          }
     }
-
-    if (pBltStateParam->bCopyCCS)
-    {
-        BLT_CHK_STATUS_RETURN(SetupCtrlSurfCopyBltParam(
-            &ctrlSurfCopyBltParam,
-            pBltStateParam->pSrcCCS,
-            pBltStateParam->pDstCCS,
-            pBltStateParam->ccsFlag));
-        //BLT_CHK_STATUS_RETURN(pbltInterfacePvc->AddCtrlSurfCopyBlt(
-        //    &cmdBuffer,
-        //    &ctrlSurfCopyBltParam));
-    }
+    BLT_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectEndCmd((void*)this, m_osInterface, m_miItf, &cmdBuffer));
 
     // Add flush DW
     auto& flushDwParams = m_miItf->MHW_GETPAR_F(MI_FLUSH_DW)();
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediacopy/media_vebox_copy_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediacopy/media_vebox_copy_xe_lpm_plus_base.cpp
index 3acff28c..77087d4b 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediacopy/media_vebox_copy_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediacopy/media_vebox_copy_xe_lpm_plus_base.cpp
@@ -155,6 +155,10 @@ MOS_STATUS VeboxCopyStateXe_Lpm_Plus_Base::CopyMainSurface(PMOS_RESOURCE src, PM
     VEBOX_COPY_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
     VEBOX_COPY_CHK_STATUS_RETURN(InitCommandBuffer(&cmdBuffer));
 
+    MediaPerfProfiler* perfProfiler = MediaPerfProfiler::Instance();
+    VEBOX_COPY_CHK_NULL_RETURN(perfProfiler);
+    VEBOX_COPY_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectStartCmd((void*)this, m_osInterface, m_miItf, &cmdBuffer));
+
     // Set Vebox MMIO
     VEBOX_COPY_CHK_STATUS_RETURN(m_miItf->AddVeboxMMIOPrologCmd(&cmdBuffer));
 
@@ -186,7 +190,7 @@ MOS_STATUS VeboxCopyStateXe_Lpm_Plus_Base::CopyMainSurface(PMOS_RESOURCE src, PM
         flushDwParams.dwDataDW1 = veboxHeap->dwNextTag;
         VEBOX_COPY_CHK_STATUS_RETURN(m_miItf->MHW_ADDCMD_F(MI_FLUSH_DW)(&cmdBuffer));
     }
-
+    VEBOX_COPY_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectEndCmd((void*)this, m_osInterface, m_miItf, &cmdBuffer));
     VEBOX_COPY_CHK_STATUS_RETURN(m_miItf->AddMiBatchBufferEnd(&cmdBuffer, nullptr));
 
     // Return unused command buffer space to OS
diff --git a/media_softlet/agnostic/common/codec/hal/codechal_debug.cpp b/media_softlet/agnostic/common/codec/hal/codechal_debug.cpp
index 1632c82f..279de5c7 100644
--- a/media_softlet/agnostic/common/codec/hal/codechal_debug.cpp
+++ b/media_softlet/agnostic/common/codec/hal/codechal_debug.cpp
@@ -794,14 +794,9 @@ MOS_STATUS CodechalDebugInterface::DumpRgbDataOnYUVSurface(
         m_osInterface->pfnUnlockResource(m_osInterface, &surface->OsResource);
     }
 
-    if (&(tmpRgbSurface->OsResource))
-    {
-        m_osInterface->pfnFreeResource(m_osInterface, &(tmpRgbSurface->OsResource));
-    }
-    if (tmpRgbSurface)
-    {
-        MOS_Delete(tmpRgbSurface);
-    }
+    m_osInterface->pfnFreeResource(m_osInterface, &(tmpRgbSurface->OsResource));
+    MOS_Delete(tmpRgbSurface);
+
     return MOS_STATUS_SUCCESS;
 }
 
diff --git a/media_softlet/agnostic/common/codec/hal/dec/avc/features/decode_avc_basic_feature.cpp b/media_softlet/agnostic/common/codec/hal/dec/avc/features/decode_avc_basic_feature.cpp
index 90e713dd..a3d75ee6 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/avc/features/decode_avc_basic_feature.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/avc/features/decode_avc_basic_feature.cpp
@@ -230,14 +230,14 @@ namespace decode {
                 PCODEC_AVC_SLICE_PARAMS slc = m_avcSliceParams + slcIdx;
                 if(m_avcPicParams->pic_fields.field_pic_flag == 0)
                 {
-                    if(slc->num_ref_idx_l0_active_minus1 > 15)
+                    if (slc->num_ref_idx_l0_active_minus1 > 15 || slc->num_ref_idx_l1_active_minus1 > 15)
                     {
                         return MOS_STATUS_INVALID_PARAMETER;
                     }
                 }
                 else if(m_avcPicParams->pic_fields.field_pic_flag == 1)
                 {
-                    if(slc->num_ref_idx_l0_active_minus1 > 31)
+                    if (slc->num_ref_idx_l0_active_minus1 > 31 || slc->num_ref_idx_l1_active_minus1 > 31)
                     {
                         return MOS_STATUS_INVALID_PARAMETER;
                     }
diff --git a/media_softlet/agnostic/common/codec/hal/dec/hevc/packet/decode_huc_s2l_packet.cpp b/media_softlet/agnostic/common/codec/hal/dec/hevc/packet/decode_huc_s2l_packet.cpp
index b956c1fd..3ef454d3 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/hevc/packet/decode_huc_s2l_packet.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/hevc/packet/decode_huc_s2l_packet.cpp
@@ -75,9 +75,10 @@ namespace decode {
         return MOS_STATUS_SUCCESS;
     }
 
-    HucS2lPkt::~HucS2lPkt()
+    MOS_STATUS HucS2lPkt::Destroy() 
     {
         FreeResource();
+        return MOS_STATUS_SUCCESS;
     }
 
     MOS_STATUS HucS2lPkt::FreeResource()
diff --git a/media_softlet/agnostic/common/codec/hal/dec/hevc/packet/decode_huc_s2l_packet.h b/media_softlet/agnostic/common/codec/hal/dec/hevc/packet/decode_huc_s2l_packet.h
index 01ea6cbd..be3c9561 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/hevc/packet/decode_huc_s2l_packet.h
+++ b/media_softlet/agnostic/common/codec/hal/dec/hevc/packet/decode_huc_s2l_packet.h
@@ -134,7 +134,7 @@ namespace decode
             }
         }
 
-        virtual ~HucS2lPkt();
+        virtual ~HucS2lPkt() {}
 
         //!
         //! \brief  Initialize the media packet, allocate required resources
@@ -157,6 +157,8 @@ namespace decode
         //!
         virtual MOS_STATUS FreeResource();
 
+        virtual MOS_STATUS Destroy() override;
+
         //!
         //! \brief  Calculate Command Size
         //!
diff --git a/media_softlet/agnostic/common/codec/hal/dec/jpeg/packet/decode_jpeg_packet.cpp b/media_softlet/agnostic/common/codec/hal/dec/jpeg/packet/decode_jpeg_packet.cpp
index 1b1c3dfe..d8d9b310 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/jpeg/packet/decode_jpeg_packet.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/jpeg/packet/decode_jpeg_packet.cpp
@@ -82,7 +82,9 @@ void JpegDecodePkt::SetPerfTag(CODECHAL_MODE mode, uint16_t picCodingType)
     DECODE_FUNC_CALL();
 
     uint16_t perfTag = ((mode << 4) & 0xF0) | (picCodingType & 0xF);
+    m_osInterface->pfnIncPerfFrameID(m_osInterface);
     m_osInterface->pfnSetPerfTag(m_osInterface, perfTag);
+    m_osInterface->pfnResetPerfBufferID(m_osInterface);
 }
 
 bool JpegDecodePkt::IsPrologRequired()
@@ -238,7 +240,8 @@ MOS_STATUS JpegDecodePkt::StartStatusReport(uint32_t srType, MOS_COMMAND_BUFFER*
 
     DECODE_CHK_STATUS(MediaPacket::StartStatusReportNext(srType, cmdBuffer));
 
-    SetPerfTag(CODECHAL_DECODE_MODE_JPEG, m_jpegBasicFeature->m_pictureCodingType);
+    // no frame type for Jpeg decode, use I as default value here
+    SetPerfTag(CODECHAL_DECODE_MODE_JPEG, I_TYPE);
 
     MediaPerfProfiler *perfProfiler = MediaPerfProfiler::Instance();
     DECODE_CHK_NULL(perfProfiler);
diff --git a/media_softlet/agnostic/common/codec/hal/dec/jpeg/packet/decode_jpeg_picture_packet.cpp b/media_softlet/agnostic/common/codec/hal/dec/jpeg/packet/decode_jpeg_picture_packet.cpp
index 5d7ea9b6..6614ba1a 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/jpeg/packet/decode_jpeg_picture_packet.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/jpeg/packet/decode_jpeg_picture_packet.cpp
@@ -420,6 +420,7 @@ MOS_STATUS JpegDecodePicPkt::AddAllCmds_MFD_JPEG_BSD_OBJECT(PMOS_COMMAND_BUFFER
     for (uint16_t scanCount = 0; scanCount < m_jpegBasicFeature->m_jpegScanParams->NumScans; scanCount++)
     {
         uint16_t numComponents = m_jpegBasicFeature->m_jpegScanParams->ScanHeader[scanCount].NumComponents;
+        MOS_ZeroMemory(&params, sizeof(params));
 
         params.indirectDataLength     = m_jpegBasicFeature->m_jpegScanParams->ScanHeader[scanCount].DataLength;
         params.dataStartAddress       = m_jpegBasicFeature->m_jpegScanParams->ScanHeader[scanCount].DataOffset;
diff --git a/media_softlet/agnostic/common/codec/hal/dec/shared/pipeline/decode_pipeline.cpp b/media_softlet/agnostic/common/codec/hal/dec/shared/pipeline/decode_pipeline.cpp
index 7b66831b..2c739539 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/shared/pipeline/decode_pipeline.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/shared/pipeline/decode_pipeline.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2018-2022, Intel Corporation
+* Copyright (c) 2018-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -428,18 +428,14 @@ MOS_STATUS DecodePipeline::DumpOutput(const DecodeStatusReportData& reportData)
         m_featureManager->GetFeature(DecodeFeatureIDs::decodeDownSampling));
     if (downSamplingFeature != nullptr && downSamplingFeature->IsEnabled())
     {
-        if (reportData.currSfcOutputPicRes != nullptr &&
+        if (reportData.currSfcOutputSurface != nullptr &&
             m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrSfcOutputSurface))
         {
-            MOS_SURFACE sfcDstSurface;
-            MOS_ZeroMemory(&sfcDstSurface, sizeof(sfcDstSurface));
-            sfcDstSurface.Format     = Format_NV12;
-            sfcDstSurface.OsResource = *reportData.currSfcOutputPicRes;
+            MOS_SURFACE &sfcDstSurface = *reportData.currSfcOutputSurface;
 
             if (!Mos_ResourceIsNull(&sfcDstSurface.OsResource))
             {
 #if (_DEBUG || _RELEASE_INTERNAL)
-                DECODE_CHK_STATUS(m_allocator->GetSurfaceInfo(&sfcDstSurface));
                 //rgb format read from reg key
                 uint32_t sfcOutputRgbFormatFlag =
                     ReadUserFeature(m_userSettingPtr, "Decode SFC RGB Format Output", MediaUserSetting::Group::Sequence).Get<uint32_t>();
@@ -615,15 +611,11 @@ MOS_STATUS DecodePipeline::ReportSfcLinearSurfaceUsage(const DecodeStatusReportD
         m_featureManager->GetFeature(DecodeFeatureIDs::decodeDownSampling));
     if (downSamplingFeature != nullptr && downSamplingFeature->IsEnabled())
     {
-        if (reportData.currSfcOutputPicRes != nullptr)
+        if (reportData.currSfcOutputSurface != nullptr)
         {
-            MOS_SURFACE sfcDstSurface;
-            MOS_ZeroMemory(&sfcDstSurface, sizeof(sfcDstSurface));
-            sfcDstSurface.Format     = Format_NV12;
-            sfcDstSurface.OsResource = *reportData.currSfcOutputPicRes;
+            MOS_SURFACE sfcDstSurface = *reportData.currSfcOutputSurface;
             if (!Mos_ResourceIsNull(&sfcDstSurface.OsResource))
             {
-                DECODE_CHK_STATUS(m_allocator->GetSurfaceInfo(&sfcDstSurface));
                 if (sfcDstSurface.TileType == MOS_TILE_LINEAR)
                 {
                     WriteUserFeature(__MEDIA_USER_FEATURE_VALUE_SFC_LINEAR_OUTPUT_USED_ID, 1, m_osInterface->pOsContext);
diff --git a/media_softlet/agnostic/common/codec/hal/dec/shared/statusreport/decode_status_report.cpp b/media_softlet/agnostic/common/codec/hal/dec/shared/statusreport/decode_status_report.cpp
index 254feb30..497b5fca 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/shared/statusreport/decode_status_report.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/shared/statusreport/decode_status_report.cpp
@@ -113,7 +113,7 @@ namespace decode {
             m_statusReportData[submitIndex].currDecodedPic = inputParameters->currOriginalPic;
             m_statusReportData[submitIndex].currDecodedPicRes = inputParameters->currDecodedPicRes;
 #if (_DEBUG || _RELEASE_INTERNAL)
-            m_statusReportData[submitIndex].currSfcOutputPicRes = inputParameters->sfcOutputPicRes;
+            m_statusReportData[submitIndex].currSfcOutputSurface = inputParameters->sfcOutputSurface;
             m_statusReportData[submitIndex].currHistogramOutBuf = inputParameters->histogramOutputBuf;
             m_statusReportData[submitIndex].frameType = inputParameters->pictureCodingType;
             m_statusReportData[submitIndex].currFgOutputPicRes = inputParameters->fgOutputPicRes;
diff --git a/media_softlet/agnostic/common/codec/hal/dec/shared/statusreport/decode_status_report.h b/media_softlet/agnostic/common/codec/hal/dec/shared/statusreport/decode_status_report.h
index d8387bc7..e96b1c7e 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/shared/statusreport/decode_status_report.h
+++ b/media_softlet/agnostic/common/codec/hal/dec/shared/statusreport/decode_status_report.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2019-2020, Intel Corporation
+* Copyright (c) 2019-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -66,7 +66,7 @@ namespace decode {
 
 #if (_DEBUG || _RELEASE_INTERNAL)
         //! \brief Applies when debug dumps are enabled, pointer to SFC output resource for the picture associated with this status report
-        PMOS_RESOURCE           currSfcOutputPicRes = nullptr;
+        PMOS_SURFACE            currSfcOutputSurface = nullptr;
         //! \brief Applies when debug dumps are enabled, pointer to histogram output resource for the picture associated with this status report
         PMOS_RESOURCE           currHistogramOutBuf = nullptr;
         //! \brief Applies when debug dumps are enabled, pointer to AV1 film grain output resource for the picture associated with this status report
diff --git a/media_softlet/agnostic/common/codec/hal/dec/shared/statusreport/decode_status_report_defs.h b/media_softlet/agnostic/common/codec/hal/dec/shared/statusreport/decode_status_report_defs.h
index a22516e6..31c9a231 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/shared/statusreport/decode_status_report_defs.h
+++ b/media_softlet/agnostic/common/codec/hal/dec/shared/statusreport/decode_status_report_defs.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2019-2021, Intel Corporation
+* Copyright (c) 2019-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -115,7 +115,7 @@ struct DecodeStatusParameters
     uint32_t           numSlices;
     MOS_RESOURCE       currDecodedPicRes;
 #if (_DEBUG || _RELEASE_INTERNAL)
-    MOS_RESOURCE      *sfcOutputPicRes;
+    MOS_SURFACE       *sfcOutputSurface;
     MOS_RESOURCE      *histogramOutputBuf;
     MOS_RESOURCE      *fgOutputPicRes;
 #endif
diff --git a/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_brc.cpp b/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_brc.cpp
index b58b70ff..15abbdeb 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_brc.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_brc.cpp
@@ -298,7 +298,7 @@ namespace encode
         dmem->UPD_FrameHdrOBUSizeInBytes         = (uint16_t)((m_basicFeature->m_av1PicParams->FrameHdrOBUSizeInBits + 7) >> 3);
         dmem->UPD_FrameHdrOBUSizeByteOffset      = (uint16_t)(m_basicFeature->m_av1PicParams->FrameHdrOBUSizeByteOffset - m_basicFeature->GetAppHdrSizeInBytes(true));
         dmem->UPD_FrameType                      = 0;
-        dmem->UPD_ErrorResilientMode             = 0;
+        dmem->UPD_ErrorResilientMode             = m_basicFeature->m_av1PicParams->PicFlags.fields.error_resilient_mode;
         dmem->UPD_IntraOnly                      = 0;
         dmem->UPD_PrimaryRefFrame                = 0;
         dmem->UPD_SegOn                          = m_basicFeature->m_av1PicParams->stAV1Segments.SegmentFlags.fields.segmentation_enabled;
diff --git a/media_softlet/agnostic/common/codec/hal/enc/av1/pipeline/encode_av1_reference_frames.cpp b/media_softlet/agnostic/common/codec/hal/enc/av1/pipeline/encode_av1_reference_frames.cpp
index 5cf39e21..5586dcf5 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/av1/pipeline/encode_av1_reference_frames.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/av1/pipeline/encode_av1_reference_frames.cpp
@@ -680,7 +680,7 @@ MHW_SETPAR_DECL_SRC(VDENC_PIPE_BUF_ADDR_STATE, Av1ReferenceFrames)
         return MOS_STATUS_INVALID_PARAMETER;
     }
 
-    if (m_basicFeature->m_pictureCodingType != I_TYPE)
+    if (m_basicFeature->m_pictureCodingType != I_TYPE && picParams->primary_ref_frame != av1PrimaryRefNone)
     {
         uint8_t frameIdx = picParams->RefFrameList[picParams->primary_ref_frame].FrameIdx;
         uint8_t idxForTempMV = m_refList[frameIdx]->ucScalingIdx;
diff --git a/media_softlet/agnostic/common/codec/hal/enc/avc/packet/encode_avc_huc_brc_init_packet.cpp b/media_softlet/agnostic/common/codec/hal/enc/avc/packet/encode_avc_huc_brc_init_packet.cpp
index 7e96b4a3..f99e3886 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/avc/packet/encode_avc_huc_brc_init_packet.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/avc/packet/encode_avc_huc_brc_init_packet.cpp
@@ -100,6 +100,7 @@ MOS_STATUS AvcHucBrcInitPkt::Submit(MOS_COMMAND_BUFFER *commandBuffer, uint8_t p
 
     ENCODE_CHK_STATUS_RETURN(brcFeature->SaveHucStatus2Buffer(m_resHucStatus2Buffer));
 
+    SetPerfTag(CODECHAL_ENCODE_PERFTAG_CALL_BRC_INIT_RESET, (uint16_t)m_basicFeature->m_mode, m_basicFeature->m_pictureCodingType);
     ENCODE_CHK_STATUS_RETURN(Execute(commandBuffer, true, requestProlog, BRC_INIT));
 
     CODECHAL_DEBUG_TOOL(
diff --git a/media_softlet/agnostic/common/codec/hal/enc/avc/packet/encode_avc_huc_brc_update_packet.cpp b/media_softlet/agnostic/common/codec/hal/enc/avc/packet/encode_avc_huc_brc_update_packet.cpp
index 1598fe1e..07a64d30 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/avc/packet/encode_avc_huc_brc_update_packet.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/avc/packet/encode_avc_huc_brc_update_packet.cpp
@@ -246,6 +246,9 @@ MOS_STATUS AvcHucBrcUpdatePkt::Execute(PMOS_COMMAND_BUFFER cmdBuffer, bool store
         ENCODE_CHK_STATUS_RETURN(m_miItf->MHW_ADDCMD_F(MI_CONDITIONAL_BATCH_BUFFER_END)(cmdBuffer));
     }
 
+    SetPerfTag(m_pipeline->IsFirstPass() ? CODECHAL_ENCODE_PERFTAG_CALL_BRC_UPDATE : CODECHAL_ENCODE_PERFTAG_CALL_BRC_UPDATE_SECOND_PASS,
+        (uint16_t)m_basicFeature->m_mode,
+        m_basicFeature->m_pictureCodingType);
     ENCODE_CHK_STATUS_RETURN(StartPerfCollect(*cmdBuffer));
     if (m_pipeline->IsSingleTaskPhaseSupported())
     {
diff --git a/media_softlet/agnostic/common/codec/hal/enc/avc/packet/encode_avc_vdenc_packet.cpp b/media_softlet/agnostic/common/codec/hal/enc/avc/packet/encode_avc_vdenc_packet.cpp
index 6d2c4c3d..877f4631 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/avc/packet/encode_avc_vdenc_packet.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/avc/packet/encode_avc_vdenc_packet.cpp
@@ -293,7 +293,9 @@ namespace encode {
 
         ENCODE_CHK_STATUS_RETURN(m_miItf->SetWatchdogTimerThreshold(m_basicFeature->m_frameWidth, m_basicFeature->m_frameHeight, true));
 
-        SetPerfTag(CODECHAL_ENCODE_PERFTAG_CALL_PAK_ENGINE, (uint16_t)m_basicFeature->m_mode, m_basicFeature->m_pictureCodingType);
+        SetPerfTag(m_pipeline->IsFirstPass() ? CODECHAL_ENCODE_PERFTAG_CALL_PAK_ENGINE : CODECHAL_ENCODE_PERFTAG_CALL_PAK_ENGINE_SECOND_PASS,
+            (uint16_t)m_basicFeature->m_mode,
+            m_basicFeature->m_pictureCodingType);
 
         auto brcFeature = dynamic_cast<AvcEncodeBRC*>(m_featureManager->GetFeature(AvcFeatureIDs::avcBrcFeature));
         ENCODE_CHK_NULL_RETURN(brcFeature);
diff --git a/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_hpu.cpp b/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_hpu.cpp
index a6cfdc10..608ae97e 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_hpu.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_hpu.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2020-2021, Intel Corporation
+* Copyright (c) 2020-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -25,6 +25,7 @@
 //!
 
 #include "encode_vp9_hpu.h"
+#include "encode_vp9_pak.h"
 #include "encode_vp9_vdenc_feature_manager.h"
 #include "encode_vp9_vdenc_const_settings.h"
 #include "media_vp9_packet_defs.h"
@@ -305,4 +306,913 @@ MHW_SETPAR_DECL_SRC(HCP_PIPE_BUF_ADDR_STATE, Vp9EncodeHpu)
     return MOS_STATUS_SUCCESS;
 }
 
+MOS_STATUS Vp9EncodeHpu::SetDefaultTxProbs(uint8_t *ctxBuffer, uint32_t &byteCnt) const
+{
+    ENCODE_FUNC_CALL();
+
+    int32_t i, j;
+    // TX probs
+    for (i = 0; i < CODEC_VP9_TX_SIZE_CONTEXTS; ++i)
+    {
+        for (j = 0; j < CODEC_VP9_TX_SIZES - 3; ++j)
+        {
+            ctxBuffer[byteCnt++] = DefaultTxProbs.p8x8[i][j];
+        }
+    }
+    for (i = 0; i < CODEC_VP9_TX_SIZE_CONTEXTS; ++i)
+    {
+        for (j = 0; j < CODEC_VP9_TX_SIZES - 2; ++j)
+        {
+            ctxBuffer[byteCnt++] = DefaultTxProbs.p16x16[i][j];
+        }
+    }
+    for (i = 0; i < CODEC_VP9_TX_SIZE_CONTEXTS; ++i)
+    {
+        for (j = 0; j < CODEC_VP9_TX_SIZES - 1; ++j)
+        {
+            ctxBuffer[byteCnt++] = DefaultTxProbs.p32x32[i][j];
+        }
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS Vp9EncodeHpu::SetDefaultCoeffProbs(uint8_t *ctxBuffer, uint32_t &byteCnt) const
+{
+    ENCODE_FUNC_CALL();
+
+    uint8_t blocktype          = 0;
+    uint8_t reftype            = 0;
+    uint8_t coeffbands         = 0;
+    uint8_t unConstrainedNodes = 0;
+    uint8_t prevCoefCtx        = 0;
+    // Coeff probs
+    for (blocktype = 0; blocktype < CODEC_VP9_BLOCK_TYPES; ++blocktype)
+    {
+        for (reftype = 0; reftype < CODEC_VP9_REF_TYPES; ++reftype)
+        {
+            for (coeffbands = 0; coeffbands < CODEC_VP9_COEF_BANDS; ++coeffbands)
+            {
+                uint8_t numPrevCoeffCtxts = (coeffbands == 0) ? 3 : CODEC_VP9_PREV_COEF_CONTEXTS;
+                for (prevCoefCtx = 0; prevCoefCtx < numPrevCoeffCtxts; ++prevCoefCtx)
+                {
+                    for (unConstrainedNodes = 0; unConstrainedNodes < CODEC_VP9_UNCONSTRAINED_NODES; ++unConstrainedNodes)
+                    {
+                        ctxBuffer[byteCnt++] = DefaultCoefProbs4x4[blocktype][reftype][coeffbands][prevCoefCtx][unConstrainedNodes];
+                    }
+                }
+            }
+        }
+    }
+
+    for (blocktype = 0; blocktype < CODEC_VP9_BLOCK_TYPES; ++blocktype)
+    {
+        for (reftype = 0; reftype < CODEC_VP9_REF_TYPES; ++reftype)
+        {
+            for (coeffbands = 0; coeffbands < CODEC_VP9_COEF_BANDS; ++coeffbands)
+            {
+                uint8_t numPrevCoeffCtxts = (coeffbands == 0) ? 3 : CODEC_VP9_PREV_COEF_CONTEXTS;
+                for (prevCoefCtx = 0; prevCoefCtx < numPrevCoeffCtxts; ++prevCoefCtx)
+                {
+                    for (unConstrainedNodes = 0; unConstrainedNodes < CODEC_VP9_UNCONSTRAINED_NODES; ++unConstrainedNodes)
+                    {
+                        ctxBuffer[byteCnt++] = DefaultCoefPprobs8x8[blocktype][reftype][coeffbands][prevCoefCtx][unConstrainedNodes];
+                    }
+                }
+            }
+        }
+    }
+
+    for (blocktype = 0; blocktype < CODEC_VP9_BLOCK_TYPES; ++blocktype)
+    {
+        for (reftype = 0; reftype < CODEC_VP9_REF_TYPES; ++reftype)
+        {
+            for (coeffbands = 0; coeffbands < CODEC_VP9_COEF_BANDS; ++coeffbands)
+            {
+                uint8_t numPrevCoeffCtxts = (coeffbands == 0) ? 3 : CODEC_VP9_PREV_COEF_CONTEXTS;
+                for (prevCoefCtx = 0; prevCoefCtx < numPrevCoeffCtxts; ++prevCoefCtx)
+                {
+                    for (unConstrainedNodes = 0; unConstrainedNodes < CODEC_VP9_UNCONSTRAINED_NODES; ++unConstrainedNodes)
+                    {
+                        ctxBuffer[byteCnt++] = DefaultCoefProbs16x16[blocktype][reftype][coeffbands][prevCoefCtx][unConstrainedNodes];
+                    }
+                }
+            }
+        }
+    }
+
+    for (blocktype = 0; blocktype < CODEC_VP9_BLOCK_TYPES; ++blocktype)
+    {
+        for (reftype = 0; reftype < CODEC_VP9_REF_TYPES; ++reftype)
+        {
+            for (coeffbands = 0; coeffbands < CODEC_VP9_COEF_BANDS; ++coeffbands)
+            {
+                uint8_t numPrevCoeffCtxts = (coeffbands == 0) ? 3 : CODEC_VP9_PREV_COEF_CONTEXTS;
+                for (prevCoefCtx = 0; prevCoefCtx < numPrevCoeffCtxts; ++prevCoefCtx)
+                {
+                    for (unConstrainedNodes = 0; unConstrainedNodes < CODEC_VP9_UNCONSTRAINED_NODES; ++unConstrainedNodes)
+                    {
+                        ctxBuffer[byteCnt++] = DefaultCoefProbs32x32[blocktype][reftype][coeffbands][prevCoefCtx][unConstrainedNodes];
+                    }
+                }
+            }
+        }
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS Vp9EncodeHpu::SetDefaultMbskipProbs(uint8_t *ctxBuffer, uint32_t &byteCnt) const
+{
+    ENCODE_FUNC_CALL();
+
+    // mb skip probs
+    for (auto i = 0; i < CODEC_VP9_MBSKIP_CONTEXTS; ++i)
+    {
+        ctxBuffer[byteCnt++] = DefaultMbskipProbs[i];
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS Vp9EncodeHpu::SetDefaultInterModeProbs(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
+{
+    ENCODE_FUNC_CALL();
+
+    int32_t i, j;
+
+    // Inter mode probs
+    for (i = 0; i < CODEC_VP9_INTER_MODE_CONTEXTS; ++i)
+    {
+        for (j = 0; j < CODEC_VP9_INTER_MODES - 1; ++j)
+        {
+            if (!setToKey)
+            {
+                ctxBuffer[byteCnt++] = DefaultInterModeProbs[i][j];
+            }
+            else
+            {
+                // Zeros for key frame
+                byteCnt++;
+            }
+        }
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS Vp9EncodeHpu::SetDefaultSwitchableInterpProb(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
+{
+    ENCODE_FUNC_CALL();
+
+    int32_t i, j;
+
+    // Switchable interprediction probs
+    for (i = 0; i < CODEC_VP9_SWITCHABLE_FILTERS + 1; ++i)
+    {
+        for (j = 0; j < CODEC_VP9_SWITCHABLE_FILTERS - 1; ++j)
+        {
+            if (!setToKey)
+            {
+                ctxBuffer[byteCnt++] = DefaultSwitchableInterpProb[i][j];
+            }
+            else
+            {
+                // Zeros for key frame
+                byteCnt++;
+            }
+        }
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS Vp9EncodeHpu::SetDefaultIntraInterProb(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
+{
+    ENCODE_FUNC_CALL();
+
+    // Intra inter probs
+    for (auto i = 0; i < CODEC_VP9_INTRA_INTER_CONTEXTS; ++i)
+    {
+        if (!setToKey)
+        {
+            ctxBuffer[byteCnt++] = DefaultIntraInterProb[i];
+        }
+        else
+        {
+            // Zeros for key frame
+            byteCnt++;
+        }
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS Vp9EncodeHpu::SetDefaultCompInterProb(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
+{
+    ENCODE_FUNC_CALL();
+
+    // Comp inter probs
+    for (auto i = 0; i < CODEC_VP9_COMP_INTER_CONTEXTS; ++i)
+    {
+        if (!setToKey)
+        {
+            ctxBuffer[byteCnt++] = DefaultCompInterProb[i];
+        }
+        else
+        {
+            // Zeros for key frame
+            byteCnt++;
+        }
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS Vp9EncodeHpu::SetDefaultSingleRefProb(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
+{
+    ENCODE_FUNC_CALL();
+
+    int32_t i, j;
+
+    // Single ref probs
+    for (i = 0; i < CODEC_VP9_REF_CONTEXTS; ++i)
+    {
+        for (j = 0; j < 2; ++j)
+        {
+            if (!setToKey)
+            {
+                ctxBuffer[byteCnt++] = DefaultSingleRefProb[i][j];
+            }
+            else
+            {
+                // Zeros for key frame
+                byteCnt++;
+            }
+        }
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS Vp9EncodeHpu::SetDefaultCompRefProb(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
+{
+    ENCODE_FUNC_CALL();
+
+    // Comp ref probs
+    for (auto i = 0; i < CODEC_VP9_REF_CONTEXTS; ++i)
+    {
+        if (!setToKey)
+        {
+            ctxBuffer[byteCnt++] = DefaultCompRefProb[i];
+        }
+        else
+        {
+            // Zeros for key frame
+            byteCnt++;
+        }
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS Vp9EncodeHpu::SetDefaultYModeProb(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
+{
+    ENCODE_FUNC_CALL();
+
+    int32_t i, j;
+
+    // y mode probs
+    for (i = 0; i < CODEC_VP9_BLOCK_SIZE_GROUPS; ++i)
+    {
+        for (j = 0; j < CODEC_VP9_INTRA_MODES - 1; ++j)
+        {
+            if (!setToKey)
+            {
+                ctxBuffer[byteCnt++] = DefaultIFYProb[i][j];
+            }
+            else
+            {
+                // Zeros for key frame, since HW will not use this buffer, but default right buffer
+                byteCnt++;
+            }
+        }
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS Vp9EncodeHpu::SetDefaultPartitionProb(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
+{
+    ENCODE_FUNC_CALL();
+
+    int32_t i, j;
+
+    // Partition probs, key & intra-only frames use key type, other inter frames use inter type
+    for (i = 0; i < CODECHAL_VP9_PARTITION_CONTEXTS; ++i)
+    {
+        for (j = 0; j < CODEC_VP9_PARTITION_TYPES - 1; ++j)
+        {
+            if (setToKey)
+            {
+                ctxBuffer[byteCnt++] = DefaultKFPartitionProb[i][j];
+            }
+            else
+            {
+                ctxBuffer[byteCnt++] = DefaultPartitionProb[i][j];
+            }
+        }
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS Vp9EncodeHpu::SetDefaultNmvContext(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
+{
+    ENCODE_FUNC_CALL();
+
+    int32_t i, j;
+
+    for (i = 0; i < (CODEC_VP9_MV_JOINTS - 1); ++i)
+    {
+        if (!setToKey)
+        {
+            ctxBuffer[byteCnt++] = DefaultNmvContext.joints[i];
+        }
+        else
+        {
+            byteCnt++;
+        }
+    }
+
+    for (i = 0; i < 2; ++i)
+    {
+        if (!setToKey)
+        {
+            ctxBuffer[byteCnt++] = DefaultNmvContext.comps[i].sign;
+            for (j = 0; j < (CODEC_VP9_MV_CLASSES - 1); ++j)
+            {
+                ctxBuffer[byteCnt++] = DefaultNmvContext.comps[i].classes[j];
+            }
+            for (j = 0; j < (CODECHAL_VP9_CLASS0_SIZE - 1); ++j)
+            {
+                ctxBuffer[byteCnt++] = DefaultNmvContext.comps[i].class0[j];
+            }
+            for (j = 0; j < CODECHAL_VP9_MV_OFFSET_BITS; ++j)
+            {
+                ctxBuffer[byteCnt++] = DefaultNmvContext.comps[i].bits[j];
+            }
+        }
+        else
+        {
+            byteCnt += 1;
+            byteCnt += (CODEC_VP9_MV_CLASSES - 1);
+            byteCnt += (CODECHAL_VP9_CLASS0_SIZE - 1);
+            byteCnt += (CODECHAL_VP9_MV_OFFSET_BITS);
+        }
+    }
+    for (i = 0; i < 2; ++i)
+    {
+        if (!setToKey)
+        {
+            for (j = 0; j < CODECHAL_VP9_CLASS0_SIZE; ++j)
+            {
+                for (int32_t k = 0; k < (CODEC_VP9_MV_FP_SIZE - 1); ++k)
+                {
+                    ctxBuffer[byteCnt++] = DefaultNmvContext.comps[i].class0_fp[j][k];
+                }
+            }
+            for (j = 0; j < (CODEC_VP9_MV_FP_SIZE - 1); ++j)
+            {
+                ctxBuffer[byteCnt++] = DefaultNmvContext.comps[i].fp[j];
+            }
+        }
+        else
+        {
+            byteCnt += (CODECHAL_VP9_CLASS0_SIZE * (CODEC_VP9_MV_FP_SIZE - 1));
+            byteCnt += (CODEC_VP9_MV_FP_SIZE - 1);
+        }
+    }
+    for (i = 0; i < 2; ++i)
+    {
+        if (!setToKey)
+        {
+            ctxBuffer[byteCnt++] = DefaultNmvContext.comps[i].class0_hp;
+            ctxBuffer[byteCnt++] = DefaultNmvContext.comps[i].hp;
+        }
+        else
+        {
+            byteCnt += 2;
+        }
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS Vp9EncodeHpu::SetDefaultUVModeProbs(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
+{
+    ENCODE_FUNC_CALL();
+
+    int32_t i, j;
+
+    // uv mode probs
+    for (i = 0; i < CODEC_VP9_INTRA_MODES; ++i)
+    {
+        for (j = 0; j < CODEC_VP9_INTRA_MODES - 1; ++j)
+        {
+            if (setToKey)
+            {
+                ctxBuffer[byteCnt++] = DefaultKFUVModeProb[i][j];
+            }
+            else
+            {
+                ctxBuffer[byteCnt++] = DefaultIFUVProbs[i][j];
+            }
+        }
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS Vp9EncodeHpu::CtxBufDiffInit(uint8_t *ctxBuffer, bool setToKey) const
+{
+    ENCODE_FUNC_CALL();
+
+    uint32_t byteCnt = CODEC_VP9_INTER_PROB_OFFSET;
+
+    ENCODE_CHK_STATUS_RETURN(SetDefaultInterModeProbs(ctxBuffer, byteCnt, setToKey));
+
+    ENCODE_CHK_STATUS_RETURN(SetDefaultSwitchableInterpProb(ctxBuffer, byteCnt, setToKey));
+
+    ENCODE_CHK_STATUS_RETURN(SetDefaultIntraInterProb(ctxBuffer, byteCnt, setToKey));
+
+    ENCODE_CHK_STATUS_RETURN(SetDefaultCompInterProb(ctxBuffer, byteCnt, setToKey));
+
+    ENCODE_CHK_STATUS_RETURN(SetDefaultSingleRefProb(ctxBuffer, byteCnt, setToKey));
+
+    ENCODE_CHK_STATUS_RETURN(SetDefaultCompRefProb(ctxBuffer, byteCnt, setToKey));
+
+    ENCODE_CHK_STATUS_RETURN(SetDefaultYModeProb(ctxBuffer, byteCnt, setToKey));
+
+    ENCODE_CHK_STATUS_RETURN(SetDefaultPartitionProb(ctxBuffer, byteCnt, setToKey));
+
+    ENCODE_CHK_STATUS_RETURN(SetDefaultNmvContext(ctxBuffer, byteCnt, setToKey));
+
+    // 47 bytes of zeros
+    byteCnt += 47;
+
+    ENCODE_CHK_STATUS_RETURN(SetDefaultUVModeProbs(ctxBuffer, byteCnt, setToKey));
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS Vp9EncodeHpu::ContextBufferInit(uint8_t *ctxBuffer, bool setToKey) const
+{
+    ENCODE_FUNC_CALL();
+
+    MOS_ZeroMemory(ctxBuffer, CODEC_VP9_SEG_PROB_OFFSET);
+
+    uint32_t byteCnt = 0;
+
+    ENCODE_CHK_STATUS_RETURN(SetDefaultTxProbs(ctxBuffer, byteCnt));
+
+    // 52 bytes of zeros
+    byteCnt += 52;
+
+    ENCODE_CHK_STATUS_RETURN(SetDefaultCoeffProbs(ctxBuffer, byteCnt));
+
+    // 16 bytes of zeros
+    byteCnt += 16;
+
+    ENCODE_CHK_STATUS_RETURN(SetDefaultMbskipProbs(ctxBuffer, byteCnt));
+
+    // Populate prob values which are different between Key and Non-Key frame
+    CtxBufDiffInit(ctxBuffer, setToKey);
+
+    // Skip Seg tree/pred probs, updating not done in this function
+    byteCnt = CODEC_VP9_SEG_PROB_OFFSET;
+    byteCnt += 7;
+    byteCnt += 3;
+
+    // 28 bytes of zeros
+    for (auto i = 0; i < 28; i++)
+    {
+        ctxBuffer[byteCnt++] = 0;
+    }
+
+    if (byteCnt > CODEC_VP9_PROB_MAX_NUM_ELEM)
+    {
+        CODECHAL_PUBLIC_ASSERTMESSAGE("Error: FrameContext array out-of-bounds, byteCnt = %d!\n", byteCnt);
+        return MOS_STATUS_NO_SPACE;
+    }
+    else
+    {
+        return MOS_STATUS_SUCCESS;
+    }
+}
+
+void Vp9EncodeHpu::PutDataForCompressedHdr(
+    CompressedHeader *compressedHdr,
+    uint32_t          bit,
+    uint32_t          prob,
+    uint32_t          binIdx)
+{
+    compressedHdr[binIdx].fields.valid        = 1;
+    compressedHdr[binIdx].fields.bin_probdiff = 1;
+    compressedHdr[binIdx].fields.bin          = bit;
+    compressedHdr[binIdx].fields.prob         = (prob == 128) ? 0 : 1;
+}
+
+MOS_STATUS Vp9EncodeHpu::RefreshFrameInternalBuffers()
+{
+    ENCODE_FUNC_CALL();
+    ENCODE_CHK_NULL_RETURN(m_basicFeature);
+    ENCODE_CHK_NULL_RETURN(m_basicFeature->m_vp9PicParams);
+
+    auto hpuFeature = dynamic_cast<Vp9EncodeHpu *>(m_featureManager->GetFeature(Vp9FeatureIDs::vp9HpuFeature));
+    ENCODE_CHK_NULL_RETURN(hpuFeature);
+    auto pakFeature = dynamic_cast<Vp9EncodePak *>(m_featureManager->GetFeature(Vp9FeatureIDs::vp9PakFeature));
+    ENCODE_CHK_NULL_RETURN(pakFeature);
+
+    MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
+
+    auto &picFields = m_basicFeature->m_vp9PicParams->PicFlags.fields;
+    ENCODE_ASSERT(picFields.refresh_frame_context == 0);
+
+    MOS_LOCK_PARAMS lockFlagsWriteOnly;
+    MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS));
+    lockFlagsWriteOnly.WriteOnly = 1;
+
+    bool keyFrame      = !picFields.frame_type;
+    bool isScaling     = (m_basicFeature->m_oriFrameWidth == m_basicFeature->m_prevFrameInfo.FrameWidth) &&
+                             (m_basicFeature->m_oriFrameHeight == m_basicFeature->m_prevFrameInfo.FrameHeight)
+                             ? false
+                             : true;
+    bool resetSegIdBuf = keyFrame || isScaling ||
+                         picFields.error_resilient_mode ||
+                         picFields.intra_only;
+
+    if (resetSegIdBuf)
+    {
+        uint8_t *data = (uint8_t *)m_allocator->LockResourceForWrite(m_basicFeature->m_resSegmentIdBuffer);
+        ENCODE_CHK_NULL_RETURN(data);
+
+        MOS_ZeroMemory(data, m_basicFeature->m_picSizeInSb * CODECHAL_CACHELINE_SIZE);
+
+        ENCODE_CHK_STATUS_RETURN(m_allocator->UnLock(m_basicFeature->m_resSegmentIdBuffer));
+    }
+
+    //refresh inter probs in needed frame context buffers
+    bool clearAll = (keyFrame || picFields.error_resilient_mode ||
+                     (picFields.reset_frame_context == 3 && picFields.intra_only));
+
+    bool clearSpecified = (picFields.reset_frame_context == 2 &&
+                           picFields.intra_only);
+
+    for (auto i = 0; i < CODEC_VP9_NUM_CONTEXTS; i++)
+    {
+        PMOS_RESOURCE resProbBuffer = nullptr;
+        ENCODE_CHK_STATUS_RETURN(hpuFeature->GetProbabilityBuffer(i, resProbBuffer));
+        ENCODE_CHK_NULL_RETURN(resProbBuffer);
+
+        if (clearAll || (clearSpecified && i == picFields.frame_context_idx))
+        {
+            uint8_t *data = (uint8_t *)m_allocator->LockResourceForWrite(resProbBuffer);
+            ENCODE_CHK_NULL_RETURN(data);
+
+            eStatus = ContextBufferInit(data, keyFrame || picFields.intra_only);
+
+            ENCODE_CHK_STATUS_RETURN(m_allocator->UnLock(resProbBuffer));
+            ENCODE_CHK_STATUS_RETURN(eStatus);
+
+            m_clearAllToKey[i] = keyFrame || picFields.intra_only;
+            if (i == 0)  //reset this flag when Ctx buffer 0 is cleared.
+            {
+                m_isPreCtx0InterProbSaved = false;
+            }
+        }
+        else if (m_clearAllToKey[i])  // this buffer is inside inter frame, but its interProb has not been init to default inter type data.
+        {
+            uint8_t *data = (uint8_t *)m_allocator->LockResourceForWrite(resProbBuffer);
+            ENCODE_CHK_NULL_RETURN(data);
+
+            if (picFields.intra_only && i == 0)  // this buffer is used as intra_only context, do not need to set interprob to be inter type.
+            {
+                eStatus = CtxBufDiffInit(data, true);
+            }
+            else  // set interprob to be inter type.
+            {
+                eStatus            = CtxBufDiffInit(data, false);
+                m_clearAllToKey[i] = false;
+            }
+
+            ENCODE_CHK_STATUS_RETURN(m_allocator->UnLock(resProbBuffer));
+            ENCODE_CHK_STATUS_RETURN(eStatus);
+        }
+        else if (i == 0)  // this buffer do not need to clear in current frame, also it has not been cleared to key type in previous frame.
+        {                 // in this case, only context buffer 0 will be temporally overwritten.
+            if (picFields.intra_only)
+            {
+                uint8_t *data = (uint8_t *)m_allocator->LockResourceForWrite(resProbBuffer);
+                ENCODE_CHK_NULL_RETURN(data);
+
+                if (!m_isPreCtx0InterProbSaved)  // only when non intra-only -> intra-only need save InterProb, otherwise leave saved InterProb unchanged.
+                {
+                    //save current interprob
+                    ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy(m_preCtx0InterProbSaved, CODECHAL_VP9_INTER_PROB_SIZE, data + CODEC_VP9_INTER_PROB_OFFSET, CODECHAL_VP9_INTER_PROB_SIZE));
+                    m_isPreCtx0InterProbSaved = true;
+                }
+                eStatus = CtxBufDiffInit(data, true);
+                ENCODE_CHK_STATUS_RETURN(m_allocator->UnLock(resProbBuffer));
+                ENCODE_CHK_STATUS_RETURN(eStatus);
+            }
+            else if (m_isPreCtx0InterProbSaved)
+            {
+                uint8_t *data = (uint8_t *)m_allocator->LockResourceForWrite(resProbBuffer);
+                ENCODE_CHK_NULL_RETURN(data);
+
+                //reload former interprob
+                ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy(data + CODEC_VP9_INTER_PROB_OFFSET, CODECHAL_VP9_INTER_PROB_SIZE, m_preCtx0InterProbSaved, CODECHAL_VP9_INTER_PROB_SIZE));
+
+                ENCODE_CHK_STATUS_RETURN(m_allocator->UnLock(resProbBuffer));
+                m_isPreCtx0InterProbSaved = false;
+            }
+        }
+    }
+
+    // compressed header
+    uint32_t          index         = 0;
+    auto              txMode        = m_basicFeature->m_txMode;
+    CompressedHeader *compressedHdr = (CompressedHeader *)MOS_AllocAndZeroMemory(sizeof(CompressedHeader) * (PAK_COMPRESSED_HDR_SYNTAX_ELEMS + 1));
+    ENCODE_CHK_NULL_RETURN(compressedHdr);
+
+    if (!picFields.LosslessFlag)
+    {
+        if (txMode == CODEC_VP9_TX_SELECTABLE)
+        {
+            PutDataForCompressedHdr(compressedHdr, 1, 128, PAK_TX_MODE_IDX);
+            PutDataForCompressedHdr(compressedHdr, 1, 128, PAK_TX_MODE_IDX + 1);
+            PutDataForCompressedHdr(compressedHdr, 1, 128, PAK_TX_MODE_SELECT_IDX);
+        }
+        else if (txMode == CODEC_VP9_TX_32X32)
+        {
+            PutDataForCompressedHdr(compressedHdr, 1, 128, PAK_TX_MODE_IDX);
+            PutDataForCompressedHdr(compressedHdr, 1, 128, PAK_TX_MODE_IDX + 1);
+            PutDataForCompressedHdr(compressedHdr, 0, 128, PAK_TX_MODE_SELECT_IDX);
+        }
+        else
+        {
+            PutDataForCompressedHdr(compressedHdr, (txMode & 0x02) >> 1, 128, PAK_TX_MODE_IDX);
+            PutDataForCompressedHdr(compressedHdr, (txMode & 0x01), 128, PAK_TX_MODE_IDX + 1);
+        }
+
+        if (txMode == CODEC_VP9_TX_SELECTABLE)
+        {
+            index = PAK_TX_8x8_PROB_IDX;
+            for (auto i = 0; i < 2; i++)
+            {
+                PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+                index += 2;
+            }
+
+            index = PAK_TX_16x16_PROB_IDX;
+            for (auto i = 0; i < 2; i++)
+            {
+                for (auto j = 0; j < 2; j++)
+                {
+                    PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+                    index += 2;
+                }
+            }
+
+            index = PAK_TX_32x32_PROB_IDX;
+            for (auto i = 0; i < 2; i++)
+            {
+                for (auto j = 0; j < 3; j++)
+                {
+                    PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+                    index += 2;
+                }
+            }
+        }
+    }
+
+    for (auto coeffSize = 0; coeffSize < 4; coeffSize++)
+    {
+        if (coeffSize > txMode)
+        {
+            continue;
+        }
+
+        switch (coeffSize)
+        {
+        case 0:
+            index = PAK_TX_4x4_COEFF_PROB_IDX;
+            break;
+        case 1:
+            index = PAK_TX_8x8_COEFF_PROB_IDX;
+            break;
+        case 2:
+            index = PAK_TX_16x16_COEFF_PROB_IDX;
+            break;
+        case 3:
+            index = PAK_TX_32x32_COEFF_PROB_IDX;
+            break;
+        }
+
+        PutDataForCompressedHdr(compressedHdr, 0, 128, index);
+    }
+
+    PutDataForCompressedHdr(compressedHdr, 0, 252, PAK_SKIP_CONTEXT_IDX);
+    PutDataForCompressedHdr(compressedHdr, 0, 252, PAK_SKIP_CONTEXT_IDX + 2);
+    PutDataForCompressedHdr(compressedHdr, 0, 252, PAK_SKIP_CONTEXT_IDX + 4);
+
+    if (picFields.frame_type != 0 && !picFields.intra_only)
+    {
+        index = PAK_INTER_MODE_CTX_IDX;
+        for (auto i = 0; i < 7; i++)
+        {
+            for (auto j = 0; j < 3; j++)
+            {
+                PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+                index += 2;
+            }
+        }
+
+        if (picFields.mcomp_filter_type == CODEC_VP9_SWITCHABLE_FILTERS)
+        {
+            index = PAK_SWITCHABLE_FILTER_CTX_IDX;
+            for (auto i = 0; i < 4; i++)
+            {
+                for (auto j = 0; j < 2; j++)
+                {
+                    PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+                    index += 2;
+                }
+            }
+        }
+
+        index = PAK_INTRA_INTER_CTX_IDX;
+        for (auto i = 0; i < 4; i++)
+        {
+            PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+            index += 2;
+        }
+
+        auto &picRefFields = m_basicFeature->m_vp9PicParams->RefFlags.fields;
+        bool  allowComp    = !(
+            (picRefFields.LastRefSignBias && picRefFields.GoldenRefSignBias && picRefFields.AltRefSignBias) ||
+            (!picRefFields.LastRefSignBias && !picRefFields.GoldenRefSignBias && !picRefFields.AltRefSignBias));
+
+        if (allowComp)
+        {
+            if (picFields.comp_prediction_mode == PRED_MODE_HYBRID)
+            {
+                PutDataForCompressedHdr(compressedHdr, 1, 128, PAK_COMPOUND_PRED_MODE_IDX);
+                PutDataForCompressedHdr(compressedHdr, 1, 128, PAK_COMPOUND_PRED_MODE_IDX + 1);
+                index = PAK_HYBRID_PRED_CTX_IDX;
+                for (auto i = 0; i < 5; i++)
+                {
+                    PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+                    index += 2;
+                }
+            }
+            else if (picFields.comp_prediction_mode == PRED_MODE_COMPOUND)
+            {
+                PutDataForCompressedHdr(compressedHdr, 1, 128, PAK_COMPOUND_PRED_MODE_IDX);
+                PutDataForCompressedHdr(compressedHdr, 0, 128, PAK_COMPOUND_PRED_MODE_IDX + 1);
+            }
+            else
+            {
+                PutDataForCompressedHdr(compressedHdr, 0, 128, PAK_COMPOUND_PRED_MODE_IDX);
+            }
+        }
+
+        if (picFields.comp_prediction_mode != PRED_MODE_COMPOUND)
+        {
+            index = PAK_SINGLE_REF_PRED_CTX_IDX;
+            for (auto i = 0; i < 5; i++)
+            {
+                for (auto j = 0; j < 2; j++)
+                {
+                    PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+                    index += 2;
+                }
+            }
+        }
+
+        if (picFields.comp_prediction_mode != PRED_MODE_SINGLE)
+        {
+            index = PAK_CMPUND_PRED_CTX_IDX;
+            for (auto i = 0; i < 5; i++)
+            {
+                PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+                index += 2;
+            }
+        }
+
+        index = PAK_INTRA_MODE_PROB_CTX_IDX;
+        for (auto i = 0; i < 4; i++)
+        {
+            for (auto j = 0; j < 9; j++)
+            {
+                PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+                index += 2;
+            }
+        }
+
+        index = PAK_PARTITION_PROB_IDX;
+        for (auto i = 0; i < 16; i++)
+        {
+            for (auto j = 0; j < 3; j++)
+            {
+                PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+                index += 2;
+            }
+        }
+
+        index = PAK_MVJOINTS_PROB_IDX;
+        for (auto i = 0; i < 3; i++)
+        {
+            PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+            index += 8;
+        }
+
+        for (auto d = 0; d < 2; d++)
+        {
+            index = (d == 0) ? PAK_MVCOMP0_IDX : PAK_MVCOMP1_IDX;
+            PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+            index += 8;
+            for (auto i = 0; i < 10; i++)
+            {
+                PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+                index += 8;
+            }
+            PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+            index += 8;
+            for (auto i = 0; i < 10; i++)
+            {
+                PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+                index += 8;
+            }
+        }
+
+        for (auto d = 0; d < 2; d++)
+        {
+            index = (d == 0) ? PAK_MVFRAC_COMP0_IDX : PAK_MVFRAC_COMP1_IDX;
+            for (auto i = 0; i < 3; i++)
+            {
+                PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+                index += 8;
+            }
+            for (auto i = 0; i < 3; i++)
+            {
+                PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+                index += 8;
+            }
+            for (auto i = 0; i < 3; i++)
+            {
+                PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+                index += 8;
+            }
+        }
+
+        if (picFields.allow_high_precision_mv)
+        {
+            for (auto d = 0; d < 2; d++)
+            {
+                index = (d == 0) ? PAK_MVHP_COMP0_IDX : PAK_MVHP_COMP1_IDX;
+                PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+                index += 8;
+                PutDataForCompressedHdr(compressedHdr, 0, 252, index);
+            }
+        }
+    }
+
+    PMOS_RESOURCE comprHeaderBuffer = pakFeature->GetCompressedHeaderBuffer();
+    ENCODE_CHK_NULL_RETURN(comprHeaderBuffer);
+
+    uint8_t *data = (uint8_t *)m_allocator->LockResourceForWrite(comprHeaderBuffer);
+    if (data == nullptr)
+    {
+        MOS_FreeMemory(compressedHdr);
+        ENCODE_CHK_NULL_RETURN(nullptr);
+    }
+
+    for (uint32_t i = 0; i < PAK_COMPRESSED_HDR_SYNTAX_ELEMS; i += 2)
+    {
+        data[i >> 1] = (compressedHdr[i + 1].value << 0x04) | (compressedHdr[i].value);
+    }
+
+    eStatus = m_allocator->UnLock(comprHeaderBuffer);
+    if (eStatus != MOS_STATUS_SUCCESS)
+    {
+        MOS_FreeMemory(compressedHdr);
+        ENCODE_CHK_STATUS_RETURN(eStatus);
+    }
+
+    MOS_FreeMemory(compressedHdr);
+    return eStatus;
+}
+
 }  // namespace encode
diff --git a/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_hpu.h b/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_hpu.h
index 7b0887c3..29de1c6b 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_hpu.h
+++ b/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_hpu.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2020-2021, Intel Corporation
+* Copyright (c) 2020-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -28,6 +28,7 @@
 
 #include "encode_vp9_basic_feature.h"
 #include "media_vp9_packet_defs.h"
+#include "codec_def_vp9_probs.h"
 
 namespace encode
 {
@@ -121,6 +122,253 @@ public:
     //!
     MOS_STATUS SetIsLastPass(bool isLastPass);
 
+    //!
+    //! \brief    Set default tx probs
+    //! \details
+    //! \param    [in,out] ctxBuffer
+    //!           Pointer to context buffer
+    //! \param    [in,out] byteCnt
+    //!           Numbe rof bytes counter
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS SetDefaultTxProbs(
+        uint8_t  *ctxBuffer,
+        uint32_t &byteCnt) const;
+
+    //!
+    //! \brief    Set default coeff probs
+    //! \details
+    //! \param    [in,out] ctxBuffer
+    //!           Pointer to context buffer
+    //! \param    [in,out] byteCnt
+    //!           Numbe rof bytes counter
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS SetDefaultCoeffProbs(
+        uint8_t  *ctxBuffer,
+        uint32_t &byteCnt) const;
+
+    //!
+    //! \brief    Set default mb skip probs
+    //! \details
+    //! \param    [in,out] ctxBuffer
+    //!           Pointer to context buffer
+    //! \param    [in,out] byteCnt
+    //!           Numbe rof bytes counter
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS SetDefaultMbskipProbs(
+        uint8_t  *ctxBuffer,
+        uint32_t &byteCnt) const;
+
+    //!
+    //! \brief    Populate prob values which are different between Key and Non-Key frame
+    //! \details
+    //! \param    [in,out] ctxBuffer
+    //!           Pointer to context buffer
+    //! \param    [in] setToKey
+    //!           Specify if it's key frame
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS CtxBufDiffInit(
+        uint8_t *ctxBuffer,
+        bool     setToKey) const;
+
+    //!
+    //! \brief    Set default inter mode probs
+    //! \details
+    //! \param    [in,out] ctxBuffer
+    //!           Pointer to context buffer
+    //! \param    [in,out] byteCnt
+    //!           Numbe rof bytes counter
+    //! \param    [in] setToKey
+    //!           Specify if it's key frame
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS SetDefaultInterModeProbs(
+        uint8_t  *ctxBuffer,
+        uint32_t &byteCnt,
+        bool      setToKey) const;
+
+    //!
+    //! \brief    Set default switchable interprediction Prob
+    //! \details
+    //! \param    [in,out] ctxBuffer
+    //!           Pointer to context buffer
+    //! \param    [in,out] byteCnt
+    //!           Numbe rof bytes counter
+    //! \param    [in] setToKey
+    //!           Specify if it's key frame
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS SetDefaultSwitchableInterpProb(
+        uint8_t  *ctxBuffer,
+        uint32_t &byteCnt,
+        bool      setToKey) const;
+
+    //!
+    //! \brief    Set default intra-inter prob
+    //! \details
+    //! \param    [in,out] ctxBuffer
+    //!           Pointer to context buffer
+    //! \param    [in,out] byteCnt
+    //!           Numbe rof bytes counter
+    //! \param    [in] setToKey
+    //!           Specify if it's key frame
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS SetDefaultIntraInterProb(
+        uint8_t  *ctxBuffer,
+        uint32_t &byteCnt,
+        bool      setToKey) const;
+
+    //!
+    //! \brief    Set default comp inter prob
+    //! \details
+    //! \param    [in,out] ctxBuffer
+    //!           Pointer to context buffer
+    //! \param    [in,out] byteCnt
+    //!           Numbe rof bytes counter
+    //! \param    [in] setToKey
+    //!           Specify if it's key frame
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS SetDefaultCompInterProb(
+        uint8_t  *ctxBuffer,
+        uint32_t &byteCnt,
+        bool      setToKey) const;
+
+    //!
+    //! \brief    Set default single reference prob
+    //! \details
+    //! \param    [in,out] ctxBuffer
+    //!           Pointer to context buffer
+    //! \param    [in,out] byteCnt
+    //!           Numbe rof bytes counter
+    //! \param    [in] setToKey
+    //!           Specify if it's key frame
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS SetDefaultSingleRefProb(
+        uint8_t  *ctxBuffer,
+        uint32_t &byteCnt,
+        bool      setToKey) const;
+
+    //!
+    //! \brief    Set default comp reference prob
+    //! \details
+    //! \param    [in,out] ctxBuffer
+    //!           Pointer to context buffer
+    //! \param    [in,out] byteCnt
+    //!           Numbe rof bytes counter
+    //! \param    [in] setToKey
+    //!           Specify if it's key frame
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS SetDefaultCompRefProb(
+        uint8_t  *ctxBuffer,
+        uint32_t &byteCnt,
+        bool      setToKey) const;
+
+    //!
+    //! \brief    Set default Y mode prob
+    //! \details
+    //! \param    [in,out] ctxBuffer
+    //!           Pointer to context buffer
+    //! \param    [in,out] byteCnt
+    //!           Numbe rof bytes counter
+    //! \param    [in] setToKey
+    //!           Specify if it's key frame
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS SetDefaultYModeProb(
+        uint8_t  *ctxBuffer,
+        uint32_t &byteCnt,
+        bool      setToKey) const;
+
+    //!
+    //! \brief    Set default partition prob
+    //! \details
+    //! \param    [in,out] ctxBuffer
+    //!           Pointer to context buffer
+    //! \param    [in,out] byteCnt
+    //!           Numbe rof bytes counter
+    //! \param    [in] setToKey
+    //!           Specify if it's key frame
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS SetDefaultPartitionProb(
+        uint8_t  *ctxBuffer,
+        uint32_t &byteCnt,
+        bool      setToKey) const;
+
+    //!
+    //! \brief    Set default NMV prob
+    //! \details
+    //! \param    [in,out] ctxBuffer
+    //!           Pointer to context buffer
+    //! \param    [in,out] byteCnt
+    //!           Numbe rof bytes counter
+    //! \param    [in] setToKey
+    //!           Specify if it's key frame
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS SetDefaultNmvContext(
+        uint8_t  *ctxBuffer,
+        uint32_t &byteCnt,
+        bool      setToKey) const;
+
+    //!
+    //! \brief    Set default UV mode prob
+    //! \details
+    //! \param    [in,out] ctxBuffer
+    //!           Pointer to context buffer
+    //! \param    [in,out] byteCnt
+    //!           Numbe rof bytes counter
+    //! \param    [in] setToKey
+    //!           Specify if it's key frame
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS SetDefaultUVModeProbs(
+        uint8_t  *ctxBuffer,
+        uint32_t &byteCnt,
+        bool      setToKey) const;
+
+    //!
+    //! \brief    Init context buffer
+    //! \details
+    //! \param    [in,out] ctxBuffer
+    //!           Pointer to context buffer
+    //! \param    [in] setToKey
+    //!           Specify if it's key frame
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS ContextBufferInit(
+        uint8_t *ctxBuffer,
+        bool     setToKey) const;
+
+    //!
+    //! \brief  Refresh frame interlnal buffers
+    //! \return MOS_STATUS
+    //!         MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS RefreshFrameInternalBuffers();
+
     //!
     //! \brief MHW parameters declaration
     //!
@@ -149,6 +397,90 @@ protected:
     MOS_RESOURCE m_resProbBuffer[CODEC_VP9_NUM_CONTEXTS] = {0};                  //!< Probability buffer
 
     mutable bool m_isLastPass = false;
+
+    //!
+    //! \struct    CompressedHeader
+    //! \brief     Compressed header
+    //!
+    struct CompressedHeader
+    {
+        union
+        {
+            struct
+            {
+                uint8_t valid : 1;         // valid =1, invalid = 0
+                uint8_t bin_probdiff : 1;  // 1= bin, 0 = prob diff
+                uint8_t prob : 1;          // 0 = 128, 1 = 252
+                uint8_t bin : 1;
+                uint8_t reserved : 4;
+            } fields;
+            uint8_t value;
+        };
+    };
+
+    /* BinIdx for compressed header generation for PAK */
+    /* The first value indicates previous SE index and second value indicates the size of the previous SE*/
+    static constexpr uint32_t PAK_TX_MODE_IDX                 = 0;                                     //idx=0
+    static constexpr uint32_t PAK_TX_MODE_SELECT_IDX          = (PAK_TX_MODE_IDX + 2);                 //idx=2
+    static constexpr uint32_t PAK_TX_8x8_PROB_IDX             = (PAK_TX_MODE_SELECT_IDX + 1);          //idx=3
+    static constexpr uint32_t PAK_TX_16x16_PROB_IDX           = (PAK_TX_8x8_PROB_IDX + 4);             //idx=7
+    static constexpr uint32_t PAK_TX_32x32_PROB_IDX           = (PAK_TX_16x16_PROB_IDX + 8);           //idx=15
+    static constexpr uint32_t PAK_TX_4x4_COEFF_PROB_IDX       = (PAK_TX_32x32_PROB_IDX + 12);          //idx=27
+    static constexpr uint32_t PAK_TX_8x8_COEFF_PROB_IDX       = (PAK_TX_4x4_COEFF_PROB_IDX + 793);     //idx=820
+    static constexpr uint32_t PAK_TX_16x16_COEFF_PROB_IDX     = (PAK_TX_8x8_COEFF_PROB_IDX + 793);     //idx=1613
+    static constexpr uint32_t PAK_TX_32x32_COEFF_PROB_IDX     = (PAK_TX_16x16_COEFF_PROB_IDX + 793);   //idx=2406
+    static constexpr uint32_t PAK_SKIP_CONTEXT_IDX            = (PAK_TX_32x32_COEFF_PROB_IDX + 793);   //idx=3199
+    static constexpr uint32_t PAK_INTER_MODE_CTX_IDX          = (PAK_SKIP_CONTEXT_IDX + 6);            //idx=3205
+    static constexpr uint32_t PAK_SWITCHABLE_FILTER_CTX_IDX   = (PAK_INTER_MODE_CTX_IDX + 42);         //idx=3247
+    static constexpr uint32_t PAK_INTRA_INTER_CTX_IDX         = (PAK_SWITCHABLE_FILTER_CTX_IDX + 16);  //idx=3263
+    static constexpr uint32_t PAK_COMPOUND_PRED_MODE_IDX      = (PAK_INTRA_INTER_CTX_IDX + 8);         //idx=3271
+    static constexpr uint32_t PAK_HYBRID_PRED_CTX_IDX         = (PAK_COMPOUND_PRED_MODE_IDX + 2);      //idx=3273
+    static constexpr uint32_t PAK_SINGLE_REF_PRED_CTX_IDX     = (PAK_HYBRID_PRED_CTX_IDX + 10);        //idx=3283
+    static constexpr uint32_t PAK_CMPUND_PRED_CTX_IDX         = (PAK_SINGLE_REF_PRED_CTX_IDX + 20);    //idx=3303
+    static constexpr uint32_t PAK_INTRA_MODE_PROB_CTX_IDX     = (PAK_CMPUND_PRED_CTX_IDX + 10);        //idx=3313
+    static constexpr uint32_t PAK_PARTITION_PROB_IDX          = (PAK_INTRA_MODE_PROB_CTX_IDX + 72);    //idx=3385
+    static constexpr uint32_t PAK_MVJOINTS_PROB_IDX           = (PAK_PARTITION_PROB_IDX + 96);         //idx=3481
+    static constexpr uint32_t PAK_MVCOMP0_IDX                 = (PAK_MVJOINTS_PROB_IDX + 24);          //idx=3505
+    static constexpr uint32_t PAK_MVCOMP1_IDX                 = (PAK_MVCOMP0_IDX + 176);               //idx=3681
+    static constexpr uint32_t PAK_MVFRAC_COMP0_IDX            = (PAK_MVCOMP1_IDX + 176);               //idx=3857
+    static constexpr uint32_t PAK_MVFRAC_COMP1_IDX            = (PAK_MVFRAC_COMP0_IDX + 72);           //idx=3929
+    static constexpr uint32_t PAK_MVHP_COMP0_IDX              = (PAK_MVFRAC_COMP1_IDX + 72);           //idx=4001
+    static constexpr uint32_t PAK_MVHP_COMP1_IDX              = (PAK_MVHP_COMP0_IDX + 16);             //idx=4017
+    static constexpr uint32_t PAK_COMPRESSED_HDR_SYNTAX_ELEMS = (PAK_MVHP_COMP1_IDX + 16);             //=4033
+
+    bool    m_clearAllToKey[CODEC_VP9_NUM_CONTEXTS]               = {false};
+    bool    m_isPreCtx0InterProbSaved                             = false;
+    uint8_t m_preCtx0InterProbSaved[CODECHAL_VP9_INTER_PROB_SIZE] = {0};
+
+    //!
+    //! \enum     PRED_MODE
+    //! \brief    Pred mode
+    //!
+    enum PRED_MODE
+    {
+        PRED_MODE_SINGLE   = 0,
+        PRED_MODE_COMPOUND = 1,
+        PRED_MODE_HYBRID   = 2
+    };
+
+    //!
+    //! \brief      Put data for compressed header
+    //!
+    //! \param      [in] compressedHdr
+    //!             Compressed header
+    //! \param      [in] bit
+    //!             Bit
+    //! \param      [in] prob
+    //!             Prob
+    //! \param      [in] binIdx
+    //!             Bin index
+    //!
+    void PutDataForCompressedHdr(
+        CompressedHeader *compressedHdr,
+        uint32_t          bit,
+        uint32_t          prob,
+        uint32_t          binIdx);
+
 MEDIA_CLASS_DEFINE_END(encode__Vp9EncodeHpu)
 };
 
diff --git a/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_pak.cpp b/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_pak.cpp
index 5ce6a4ba..0e355d5e 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_pak.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_pak.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2020-2022, Intel Corporation
+* Copyright (c) 2020-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -178,7 +178,7 @@ MOS_STATUS Vp9EncodePak::ConstructPicStateBatchBuffer(EncodePipeline* pipeline)
     if ((dysRefFrameFlags == DYS_REF_NONE) && m_basicFeature->m_pakOnlyModeEnabledForLastPass)
     {
         // This flag sets PAK-only mode in SLBB for rePAK pass. In single-pass mode, this flag should be disabled.
-        m_basicFeature->m_vdencPakonlyMultipassEnabled = ((passNum > 0) && isLastPass) ? true : false;
+        m_basicFeature->m_vdencPakonlyMultipassEnabled = ((passNum > 1) && isLastPass) ? true : false;
     }
 
     // This function will call by Vp9HucProbPkt or Vp9HucBrcUpdatePkt.
@@ -408,6 +408,13 @@ MOS_STATUS Vp9EncodePak::PakConstructPicStateBatchBuffer(PMOS_RESOURCE picStateB
     return MOS_STATUS_SUCCESS;
 }
 
+PMOS_RESOURCE Vp9EncodePak::GetCompressedHeaderBuffer()
+{
+    ENCODE_FUNC_CALL();
+
+    return &m_resCompressedHeaderBuffer;
+}
+
 MOS_STATUS Vp9EncodePak::AllocateResources()
 {
     ENCODE_FUNC_CALL();
diff --git a/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_pak.h b/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_pak.h
index 0c9136dc..04667389 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_pak.h
+++ b/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_pak.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2020-2022, Intel Corporation
+* Copyright (c) 2020-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -280,6 +280,12 @@ public:
     MOS_STATUS PakConstructPicStateBatchBuffer(
         PMOS_RESOURCE picStateBuffer);
 
+    //!
+    //! \brief  Get compressed header buffer
+    //! \return Pointer to the buffer
+    //!
+    PMOS_RESOURCE GetCompressedHeaderBuffer();
+
     //!
     //! \brief MHW parameters declaration
     //!
diff --git a/media_softlet/agnostic/common/codec/hal/enc/vp9/packet/encode_vp9_hpu_packet.cpp b/media_softlet/agnostic/common/codec/hal/enc/vp9/packet/encode_vp9_hpu_packet.cpp
index 9b5c9965..c9d8c854 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/vp9/packet/encode_vp9_hpu_packet.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/vp9/packet/encode_vp9_hpu_packet.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2020-2022, Intel Corporation
+* Copyright (c) 2020-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -557,8 +557,8 @@ MOS_STATUS Vp9HpuPkt::SetDmemBuffer() const
             uint8_t *data = (uint8_t *)m_allocator->LockResourceForWrite(resProbBuffer);
             ENCODE_CHK_NULL_RETURN(data);
 
-            ContextBufferInit(data, 0);
-            CtxBufDiffInit(data, 0);
+            hpuFeature->ContextBufferInit(data, 0);
+            hpuFeature->CtxBufDiffInit(data, 0);
 
             ENCODE_CHK_STATUS_RETURN(m_allocator->UnLock(resProbBuffer));
         }
@@ -596,7 +596,7 @@ MOS_STATUS Vp9HpuPkt::SetDmemBuffer() const
 
     // For DyS CQP or BRC case there is no Repak on last pass. So disable the Repak flag here.
     // We also disable repak pass in TU7 speed mode usage for performance reasons
-    dmem->RePak = (m_pipeline->GetPassNum() > 0 && m_pipeline->IsLastPass() && !(m_basicFeature->m_dysCqp || m_basicFeature->m_dysBrc) &&
+    dmem->RePak = (m_pipeline->GetPassNum() > 1 && m_pipeline->IsLastPass() && !(m_basicFeature->m_dysCqp || m_basicFeature->m_dysBrc) &&
         !TargetUsage::isSpeed(vp9SeqParams->TargetUsage));
 
     dmem->PrevFrameInfo = m_basicFeature->m_prevFrameInfo;
@@ -626,511 +626,6 @@ MOS_STATUS Vp9HpuPkt::SetDmemBuffer() const
     return MOS_STATUS_SUCCESS;
 }
 
-MOS_STATUS Vp9HpuPkt::ContextBufferInit(uint8_t *ctxBuffer, bool setToKey) const
-{
-    ENCODE_FUNC_CALL();
-
-    MOS_ZeroMemory(ctxBuffer, CODEC_VP9_SEG_PROB_OFFSET);
-
-    uint32_t byteCnt = 0;
-
-    ENCODE_CHK_STATUS_RETURN(SetDefaultTxProbs(ctxBuffer, byteCnt));
-
-    // 52 bytes of zeros
-    byteCnt += 52;
-
-    ENCODE_CHK_STATUS_RETURN(SetDefaultCoeffProbs(ctxBuffer, byteCnt));
-
-    // 16 bytes of zeros
-    byteCnt += 16;
-
-    ENCODE_CHK_STATUS_RETURN(SetDefaultMbskipProbs(ctxBuffer, byteCnt));
-
-    // Populate prob values which are different between Key and Non-Key frame
-    CtxBufDiffInit(ctxBuffer, setToKey);
-
-    // Skip Seg tree/pred probs, updating not done in this function
-    byteCnt = CODEC_VP9_SEG_PROB_OFFSET;
-    byteCnt += 7;
-    byteCnt += 3;
-
-    // 28 bytes of zeros
-    for (auto i = 0; i < 28; i++)
-    {
-        ctxBuffer[byteCnt++] = 0;
-    }
-
-    if (byteCnt > CODEC_VP9_PROB_MAX_NUM_ELEM)
-    {
-        CODECHAL_PUBLIC_ASSERTMESSAGE("Error: FrameContext array out-of-bounds, byteCnt = %d!\n", byteCnt);
-        return MOS_STATUS_NO_SPACE;
-    }
-    else
-    {
-        return MOS_STATUS_SUCCESS;
-    }
-}
-
-MOS_STATUS Vp9HpuPkt::SetDefaultTxProbs(uint8_t *ctxBuffer, uint32_t &byteCnt) const
-{
-    ENCODE_FUNC_CALL();
-
-    int32_t i, j;
-    // TX probs
-    for (i = 0; i < CODEC_VP9_TX_SIZE_CONTEXTS; ++i)
-    {
-        for (j = 0; j < CODEC_VP9_TX_SIZES - 3; ++j)
-        {
-            ctxBuffer[byteCnt++] = DefaultTxProbs.p8x8[i][j];
-        }
-    }
-    for (i = 0; i < CODEC_VP9_TX_SIZE_CONTEXTS; ++i)
-    {
-        for (j = 0; j < CODEC_VP9_TX_SIZES - 2; ++j)
-        {
-            ctxBuffer[byteCnt++] = DefaultTxProbs.p16x16[i][j];
-        }
-    }
-    for (i = 0; i < CODEC_VP9_TX_SIZE_CONTEXTS; ++i)
-    {
-        for (j = 0; j < CODEC_VP9_TX_SIZES - 1; ++j)
-        {
-            ctxBuffer[byteCnt++] = DefaultTxProbs.p32x32[i][j];
-        }
-    }
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS Vp9HpuPkt::SetDefaultCoeffProbs(uint8_t *ctxBuffer, uint32_t &byteCnt) const
-{
-    ENCODE_FUNC_CALL();
-
-    uint8_t blocktype          = 0;
-    uint8_t reftype            = 0;
-    uint8_t coeffbands         = 0;
-    uint8_t unConstrainedNodes = 0;
-    uint8_t prevCoefCtx        = 0;
-    // Coeff probs
-    for (blocktype = 0; blocktype < CODEC_VP9_BLOCK_TYPES; ++blocktype)
-    {
-        for (reftype = 0; reftype < CODEC_VP9_REF_TYPES; ++reftype)
-        {
-            for (coeffbands = 0; coeffbands < CODEC_VP9_COEF_BANDS; ++coeffbands)
-            {
-                uint8_t numPrevCoeffCtxts = (coeffbands == 0) ? 3 : CODEC_VP9_PREV_COEF_CONTEXTS;
-                for (prevCoefCtx = 0; prevCoefCtx < numPrevCoeffCtxts; ++prevCoefCtx)
-                {
-                    for (unConstrainedNodes = 0; unConstrainedNodes < CODEC_VP9_UNCONSTRAINED_NODES; ++unConstrainedNodes)
-                    {
-                        ctxBuffer[byteCnt++] = DefaultCoefProbs4x4[blocktype][reftype][coeffbands][prevCoefCtx][unConstrainedNodes];
-                    }
-                }
-            }
-        }
-    }
-
-    for (blocktype = 0; blocktype < CODEC_VP9_BLOCK_TYPES; ++blocktype)
-    {
-        for (reftype = 0; reftype < CODEC_VP9_REF_TYPES; ++reftype)
-        {
-            for (coeffbands = 0; coeffbands < CODEC_VP9_COEF_BANDS; ++coeffbands)
-            {
-                uint8_t numPrevCoeffCtxts = (coeffbands == 0) ? 3 : CODEC_VP9_PREV_COEF_CONTEXTS;
-                for (prevCoefCtx = 0; prevCoefCtx < numPrevCoeffCtxts; ++prevCoefCtx)
-                {
-                    for (unConstrainedNodes = 0; unConstrainedNodes < CODEC_VP9_UNCONSTRAINED_NODES; ++unConstrainedNodes)
-                    {
-                        ctxBuffer[byteCnt++] = DefaultCoefPprobs8x8[blocktype][reftype][coeffbands][prevCoefCtx][unConstrainedNodes];
-                    }
-                }
-            }
-        }
-    }
-
-    for (blocktype = 0; blocktype < CODEC_VP9_BLOCK_TYPES; ++blocktype)
-    {
-        for (reftype = 0; reftype < CODEC_VP9_REF_TYPES; ++reftype)
-        {
-            for (coeffbands = 0; coeffbands < CODEC_VP9_COEF_BANDS; ++coeffbands)
-            {
-                uint8_t numPrevCoeffCtxts = (coeffbands == 0) ? 3 : CODEC_VP9_PREV_COEF_CONTEXTS;
-                for (prevCoefCtx = 0; prevCoefCtx < numPrevCoeffCtxts; ++prevCoefCtx)
-                {
-                    for (unConstrainedNodes = 0; unConstrainedNodes < CODEC_VP9_UNCONSTRAINED_NODES; ++unConstrainedNodes)
-                    {
-                        ctxBuffer[byteCnt++] = DefaultCoefProbs16x16[blocktype][reftype][coeffbands][prevCoefCtx][unConstrainedNodes];
-                    }
-                }
-            }
-        }
-    }
-
-    for (blocktype = 0; blocktype < CODEC_VP9_BLOCK_TYPES; ++blocktype)
-    {
-        for (reftype = 0; reftype < CODEC_VP9_REF_TYPES; ++reftype)
-        {
-            for (coeffbands = 0; coeffbands < CODEC_VP9_COEF_BANDS; ++coeffbands)
-            {
-                uint8_t numPrevCoeffCtxts = (coeffbands == 0) ? 3 : CODEC_VP9_PREV_COEF_CONTEXTS;
-                for (prevCoefCtx = 0; prevCoefCtx < numPrevCoeffCtxts; ++prevCoefCtx)
-                {
-                    for (unConstrainedNodes = 0; unConstrainedNodes < CODEC_VP9_UNCONSTRAINED_NODES; ++unConstrainedNodes)
-                    {
-                        ctxBuffer[byteCnt++] = DefaultCoefProbs32x32[blocktype][reftype][coeffbands][prevCoefCtx][unConstrainedNodes];
-                    }
-                }
-            }
-        }
-    }
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS Vp9HpuPkt::SetDefaultMbskipProbs(uint8_t *ctxBuffer, uint32_t &byteCnt) const
-{
-    ENCODE_FUNC_CALL();
-
-    // mb skip probs
-    for (auto i = 0; i < CODEC_VP9_MBSKIP_CONTEXTS; ++i)
-    {
-        ctxBuffer[byteCnt++] = DefaultMbskipProbs[i];
-    }
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS Vp9HpuPkt::CtxBufDiffInit(uint8_t *ctxBuffer, bool setToKey) const
-{
-    ENCODE_FUNC_CALL();
-
-    uint32_t byteCnt = CODEC_VP9_INTER_PROB_OFFSET;
-
-    ENCODE_CHK_STATUS_RETURN(SetDefaultInterModeProbs(ctxBuffer, byteCnt, setToKey));
-
-    ENCODE_CHK_STATUS_RETURN(SetDefaultSwitchableInterpProb(ctxBuffer, byteCnt, setToKey));
-
-    ENCODE_CHK_STATUS_RETURN(SetDefaultIntraInterProb(ctxBuffer, byteCnt, setToKey));
-
-    ENCODE_CHK_STATUS_RETURN(SetDefaultCompInterProb(ctxBuffer, byteCnt, setToKey));
-
-    ENCODE_CHK_STATUS_RETURN(SetDefaultSingleRefProb(ctxBuffer, byteCnt, setToKey));
-
-    ENCODE_CHK_STATUS_RETURN(SetDefaultCompRefProb(ctxBuffer, byteCnt, setToKey));
-
-    ENCODE_CHK_STATUS_RETURN(SetDefaultYModeProb(ctxBuffer, byteCnt, setToKey));
-
-    ENCODE_CHK_STATUS_RETURN(SetDefaultPartitionProb(ctxBuffer, byteCnt, setToKey));
-
-    ENCODE_CHK_STATUS_RETURN(SetDefaultNmvContext(ctxBuffer, byteCnt, setToKey));
-
-    // 47 bytes of zeros
-    byteCnt += 47;
-
-    ENCODE_CHK_STATUS_RETURN(SetDefaultUVModeProbs(ctxBuffer, byteCnt, setToKey));
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS Vp9HpuPkt::SetDefaultInterModeProbs(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
-{
-    ENCODE_FUNC_CALL();
-
-    int32_t i, j;
-
-    // Inter mode probs
-    for (i = 0; i < CODEC_VP9_INTER_MODE_CONTEXTS; ++i)
-    {
-        for (j = 0; j < CODEC_VP9_INTER_MODES - 1; ++j)
-        {
-            if (!setToKey)
-            {
-                ctxBuffer[byteCnt++] = DefaultInterModeProbs[i][j];
-            }
-            else
-            {
-                // Zeros for key frame
-                byteCnt++;
-            }
-        }
-    }
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS Vp9HpuPkt::SetDefaultSwitchableInterpProb(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
-{
-    ENCODE_FUNC_CALL();
-
-    int32_t i, j;
-
-    // Switchable interprediction probs
-    for (i = 0; i < CODEC_VP9_SWITCHABLE_FILTERS + 1; ++i)
-    {
-        for (j = 0; j < CODEC_VP9_SWITCHABLE_FILTERS - 1; ++j)
-        {
-            if (!setToKey)
-            {
-                ctxBuffer[byteCnt++] = DefaultSwitchableInterpProb[i][j];
-            }
-            else
-            {
-                // Zeros for key frame
-                byteCnt++;
-            }
-        }
-    }
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS Vp9HpuPkt::SetDefaultIntraInterProb(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
-{
-    ENCODE_FUNC_CALL();
-
-    // Intra inter probs
-    for (auto i = 0; i < CODEC_VP9_INTRA_INTER_CONTEXTS; ++i)
-    {
-        if (!setToKey)
-        {
-            ctxBuffer[byteCnt++] = DefaultIntraInterProb[i];
-        }
-        else
-        {
-            // Zeros for key frame
-            byteCnt++;
-        }
-    }
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS Vp9HpuPkt::SetDefaultCompInterProb(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
-{
-    ENCODE_FUNC_CALL();
-
-    // Comp inter probs
-    for (auto i = 0; i < CODEC_VP9_COMP_INTER_CONTEXTS; ++i)
-    {
-        if (!setToKey)
-        {
-            ctxBuffer[byteCnt++] = DefaultCompInterProb[i];
-        }
-        else
-        {
-            // Zeros for key frame
-            byteCnt++;
-        }
-    }
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS Vp9HpuPkt::SetDefaultSingleRefProb(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
-{
-    ENCODE_FUNC_CALL();
-
-    int32_t i, j;
-
-    // Single ref probs
-    for (i = 0; i < CODEC_VP9_REF_CONTEXTS; ++i)
-    {
-        for (j = 0; j < 2; ++j)
-        {
-            if (!setToKey)
-            {
-                ctxBuffer[byteCnt++] = DefaultSingleRefProb[i][j];
-            }
-            else
-            {
-                // Zeros for key frame
-                byteCnt++;
-            }
-        }
-    }
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS Vp9HpuPkt::SetDefaultCompRefProb(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
-{
-    ENCODE_FUNC_CALL();
-
-    // Comp ref probs
-    for (auto i = 0; i < CODEC_VP9_REF_CONTEXTS; ++i)
-    {
-        if (!setToKey)
-        {
-            ctxBuffer[byteCnt++] = DefaultCompRefProb[i];
-        }
-        else
-        {
-            // Zeros for key frame
-            byteCnt++;
-        }
-    }
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS Vp9HpuPkt::SetDefaultYModeProb(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
-{
-    ENCODE_FUNC_CALL();
-
-    int32_t i, j;
-
-    // y mode probs
-    for (i = 0; i < CODEC_VP9_BLOCK_SIZE_GROUPS; ++i)
-    {
-        for (j = 0; j < CODEC_VP9_INTRA_MODES - 1; ++j)
-        {
-            if (!setToKey)
-            {
-                ctxBuffer[byteCnt++] = DefaultIFYProb[i][j];
-            }
-            else
-            {
-                // Zeros for key frame, since HW will not use this buffer, but default right buffer
-                byteCnt++;
-            }
-        }
-    }
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS Vp9HpuPkt::SetDefaultPartitionProb(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
-{
-    ENCODE_FUNC_CALL();
-
-    int32_t i, j;
-
-    // Partition probs, key & intra-only frames use key type, other inter frames use inter type
-    for (i = 0; i < CODECHAL_VP9_PARTITION_CONTEXTS; ++i)
-    {
-        for (j = 0; j < CODEC_VP9_PARTITION_TYPES - 1; ++j)
-        {
-            if (setToKey)
-            {
-                ctxBuffer[byteCnt++] = DefaultKFPartitionProb[i][j];
-            }
-            else
-            {
-                ctxBuffer[byteCnt++] = DefaultPartitionProb[i][j];
-            }
-        }
-    }
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS Vp9HpuPkt::SetDefaultNmvContext(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
-{
-    ENCODE_FUNC_CALL();
-
-    int32_t i, j;
-
-    for (i = 0; i < (CODEC_VP9_MV_JOINTS - 1); ++i)
-    {
-        if (!setToKey)
-        {
-            ctxBuffer[byteCnt++] = DefaultNmvContext.joints[i];
-        }
-        else
-        {
-            byteCnt++;
-        }
-    }
-
-    for (i = 0; i < 2; ++i)
-    {
-        if (!setToKey)
-        {
-            ctxBuffer[byteCnt++] = DefaultNmvContext.comps[i].sign;
-            for (j = 0; j < (CODEC_VP9_MV_CLASSES - 1); ++j)
-            {
-                ctxBuffer[byteCnt++] = DefaultNmvContext.comps[i].classes[j];
-            }
-            for (j = 0; j < (CODECHAL_VP9_CLASS0_SIZE - 1); ++j)
-            {
-                ctxBuffer[byteCnt++] = DefaultNmvContext.comps[i].class0[j];
-            }
-            for (j = 0; j < CODECHAL_VP9_MV_OFFSET_BITS; ++j)
-            {
-                ctxBuffer[byteCnt++] = DefaultNmvContext.comps[i].bits[j];
-            }
-        }
-        else
-        {
-            byteCnt += 1;
-            byteCnt += (CODEC_VP9_MV_CLASSES - 1);
-            byteCnt += (CODECHAL_VP9_CLASS0_SIZE - 1);
-            byteCnt += (CODECHAL_VP9_MV_OFFSET_BITS);
-        }
-    }
-    for (i = 0; i < 2; ++i)
-    {
-        if (!setToKey)
-        {
-            for (j = 0; j < CODECHAL_VP9_CLASS0_SIZE; ++j)
-            {
-                for (int32_t k = 0; k < (CODEC_VP9_MV_FP_SIZE - 1); ++k)
-                {
-                    ctxBuffer[byteCnt++] = DefaultNmvContext.comps[i].class0_fp[j][k];
-                }
-            }
-            for (j = 0; j < (CODEC_VP9_MV_FP_SIZE - 1); ++j)
-            {
-                ctxBuffer[byteCnt++] = DefaultNmvContext.comps[i].fp[j];
-            }
-        }
-        else
-        {
-            byteCnt += (CODECHAL_VP9_CLASS0_SIZE * (CODEC_VP9_MV_FP_SIZE - 1));
-            byteCnt += (CODEC_VP9_MV_FP_SIZE - 1);
-        }
-    }
-    for (i = 0; i < 2; ++i)
-    {
-        if (!setToKey)
-        {
-            ctxBuffer[byteCnt++] = DefaultNmvContext.comps[i].class0_hp;
-            ctxBuffer[byteCnt++] = DefaultNmvContext.comps[i].hp;
-        }
-        else
-        {
-            byteCnt += 2;
-        }
-    }
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS Vp9HpuPkt::SetDefaultUVModeProbs(uint8_t *ctxBuffer, uint32_t &byteCnt, bool setToKey) const
-{
-    ENCODE_FUNC_CALL();
-
-    int32_t i, j;
-
-    // uv mode probs
-    for (i = 0; i < CODEC_VP9_INTRA_MODES; ++i)
-    {
-        for (j = 0; j < CODEC_VP9_INTRA_MODES - 1; ++j)
-        {
-            if (setToKey)
-            {
-                ctxBuffer[byteCnt++] = DefaultKFUVModeProb[i][j];
-            }
-            else
-            {
-                ctxBuffer[byteCnt++] = DefaultIFUVProbs[i][j];
-            }
-        }
-    }
-
-    return MOS_STATUS_SUCCESS;
-}
-
 uint8_t Vp9HpuPkt::GetReferenceBufferSlotIndex(uint8_t refreshFlags) const
 {
     // Even if there could be multiple reference frames in the buffer
diff --git a/media_softlet/agnostic/common/codec/hal/enc/vp9/packet/encode_vp9_hpu_packet.h b/media_softlet/agnostic/common/codec/hal/enc/vp9/packet/encode_vp9_hpu_packet.h
index 9db0fc10..8c2783b9 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/vp9/packet/encode_vp9_hpu_packet.h
+++ b/media_softlet/agnostic/common/codec/hal/enc/vp9/packet/encode_vp9_hpu_packet.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2020, Intel Corporation
+* Copyright (c) 2020-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -150,246 +150,6 @@ public:
     //!
     virtual MOS_STATUS SetDmemBuffer() const;
 
-    //!
-    //! \brief    Init context buffer
-    //! \details
-    //! \param    [in,out] ctxBuffer
-    //!           Pointer to context buffer
-    //! \param    [in] setToKey
-    //!           Specify if it's key frame
-    //! \return   MOS_STATUS
-    //!           MOS_STATUS_SUCCESS if success, else fail reason
-    //!
-    MOS_STATUS ContextBufferInit(
-        uint8_t *ctxBuffer,
-        bool     setToKey) const;
-
-    //!
-    //! \brief    Set default tx probs
-    //! \details
-    //! \param    [in,out] ctxBuffer
-    //!           Pointer to context buffer
-    //! \param    [in,out] byteCnt
-    //!           Numbe rof bytes counter
-    //! \return   MOS_STATUS
-    //!           MOS_STATUS_SUCCESS if success, else fail reason
-    //!
-    MOS_STATUS SetDefaultTxProbs(
-        uint8_t *ctxBuffer,
-        uint32_t& byteCnt) const;
-
-    //!
-    //! \brief    Set default coeff probs
-    //! \details
-    //! \param    [in,out] ctxBuffer
-    //!           Pointer to context buffer
-    //! \param    [in,out] byteCnt
-    //!           Numbe rof bytes counter
-    //! \return   MOS_STATUS
-    //!           MOS_STATUS_SUCCESS if success, else fail reason
-    //!
-    MOS_STATUS SetDefaultCoeffProbs(
-        uint8_t * ctxBuffer,
-        uint32_t &byteCnt) const;
-
-    //!
-    //! \brief    Set default mb skip probs
-    //! \details
-    //! \param    [in,out] ctxBuffer
-    //!           Pointer to context buffer
-    //! \param    [in,out] byteCnt
-    //!           Numbe rof bytes counter
-    //! \return   MOS_STATUS
-    //!           MOS_STATUS_SUCCESS if success, else fail reason
-    //!
-    MOS_STATUS SetDefaultMbskipProbs(
-        uint8_t * ctxBuffer,
-        uint32_t &byteCnt) const;
-
-    //!
-    //! \brief    Populate prob values which are different between Key and Non-Key frame
-    //! \details
-    //! \param    [in,out] ctxBuffer
-    //!           Pointer to context buffer
-    //! \param    [in] setToKey
-    //!           Specify if it's key frame
-    //! \return   MOS_STATUS
-    //!           MOS_STATUS_SUCCESS if success, else fail reason
-    //!
-    MOS_STATUS CtxBufDiffInit(
-        uint8_t *ctxBuffer,
-        bool     setToKey) const;
-
-    //!
-    //! \brief    Set default inter mode probs
-    //! \details
-    //! \param    [in,out] ctxBuffer
-    //!           Pointer to context buffer
-    //! \param    [in,out] byteCnt
-    //!           Numbe rof bytes counter
-    //! \param    [in] setToKey
-    //!           Specify if it's key frame
-    //! \return   MOS_STATUS
-    //!           MOS_STATUS_SUCCESS if success, else fail reason
-    //!
-    MOS_STATUS SetDefaultInterModeProbs(
-        uint8_t * ctxBuffer,
-        uint32_t &byteCnt,
-        bool      setToKey) const;
-
-    //!
-    //! \brief    Set default switchable interprediction Prob
-    //! \details
-    //! \param    [in,out] ctxBuffer
-    //!           Pointer to context buffer
-    //! \param    [in,out] byteCnt
-    //!           Numbe rof bytes counter
-    //! \param    [in] setToKey
-    //!           Specify if it's key frame
-    //! \return   MOS_STATUS
-    //!           MOS_STATUS_SUCCESS if success, else fail reason
-    //!
-    MOS_STATUS SetDefaultSwitchableInterpProb(
-        uint8_t * ctxBuffer,
-        uint32_t &byteCnt,
-        bool      setToKey) const;
-
-    //!
-    //! \brief    Set default intra-inter prob
-    //! \details
-    //! \param    [in,out] ctxBuffer
-    //!           Pointer to context buffer
-    //! \param    [in,out] byteCnt
-    //!           Numbe rof bytes counter
-    //! \param    [in] setToKey
-    //!           Specify if it's key frame
-    //! \return   MOS_STATUS
-    //!           MOS_STATUS_SUCCESS if success, else fail reason
-    //!
-    MOS_STATUS SetDefaultIntraInterProb(
-        uint8_t * ctxBuffer,
-        uint32_t &byteCnt,
-        bool      setToKey) const;
-
-    //!
-    //! \brief    Set default comp inter prob
-    //! \details
-    //! \param    [in,out] ctxBuffer
-    //!           Pointer to context buffer
-    //! \param    [in,out] byteCnt
-    //!           Numbe rof bytes counter
-    //! \param    [in] setToKey
-    //!           Specify if it's key frame
-    //! \return   MOS_STATUS
-    //!           MOS_STATUS_SUCCESS if success, else fail reason
-    //!
-    MOS_STATUS SetDefaultCompInterProb(
-        uint8_t * ctxBuffer,
-        uint32_t &byteCnt,
-        bool      setToKey) const;
-
-    //!
-    //! \brief    Set default single reference prob
-    //! \details
-    //! \param    [in,out] ctxBuffer
-    //!           Pointer to context buffer
-    //! \param    [in,out] byteCnt
-    //!           Numbe rof bytes counter
-    //! \param    [in] setToKey
-    //!           Specify if it's key frame
-    //! \return   MOS_STATUS
-    //!           MOS_STATUS_SUCCESS if success, else fail reason
-    //!
-    MOS_STATUS SetDefaultSingleRefProb(
-        uint8_t * ctxBuffer,
-        uint32_t &byteCnt,
-        bool      setToKey) const;
-
-    //!
-    //! \brief    Set default comp reference prob
-    //! \details
-    //! \param    [in,out] ctxBuffer
-    //!           Pointer to context buffer
-    //! \param    [in,out] byteCnt
-    //!           Numbe rof bytes counter
-    //! \param    [in] setToKey
-    //!           Specify if it's key frame
-    //! \return   MOS_STATUS
-    //!           MOS_STATUS_SUCCESS if success, else fail reason
-    //!
-    MOS_STATUS SetDefaultCompRefProb(
-        uint8_t * ctxBuffer,
-        uint32_t &byteCnt,
-        bool      setToKey) const;
-
-    //!
-    //! \brief    Set default Y mode prob
-    //! \details
-    //! \param    [in,out] ctxBuffer
-    //!           Pointer to context buffer
-    //! \param    [in,out] byteCnt
-    //!           Numbe rof bytes counter
-    //! \param    [in] setToKey
-    //!           Specify if it's key frame
-    //! \return   MOS_STATUS
-    //!           MOS_STATUS_SUCCESS if success, else fail reason
-    //!
-    MOS_STATUS SetDefaultYModeProb(
-        uint8_t * ctxBuffer,
-        uint32_t &byteCnt,
-        bool      setToKey) const;
-
-    //!
-    //! \brief    Set default partition prob
-    //! \details
-    //! \param    [in,out] ctxBuffer
-    //!           Pointer to context buffer
-    //! \param    [in,out] byteCnt
-    //!           Numbe rof bytes counter
-    //! \param    [in] setToKey
-    //!           Specify if it's key frame
-    //! \return   MOS_STATUS
-    //!           MOS_STATUS_SUCCESS if success, else fail reason
-    //!
-    MOS_STATUS SetDefaultPartitionProb(
-        uint8_t * ctxBuffer,
-        uint32_t &byteCnt,
-        bool      setToKey) const;
-
-    //!
-    //! \brief    Set default NMV prob
-    //! \details
-    //! \param    [in,out] ctxBuffer
-    //!           Pointer to context buffer
-    //! \param    [in,out] byteCnt
-    //!           Numbe rof bytes counter
-    //! \param    [in] setToKey
-    //!           Specify if it's key frame
-    //! \return   MOS_STATUS
-    //!           MOS_STATUS_SUCCESS if success, else fail reason
-    //!
-    MOS_STATUS SetDefaultNmvContext(
-        uint8_t * ctxBuffer,
-        uint32_t &byteCnt,
-        bool      setToKey) const;
-
-    //!
-    //! \brief    Set default UV mode prob
-    //! \details
-    //! \param    [in,out] ctxBuffer
-    //!           Pointer to context buffer
-    //! \param    [in,out] byteCnt
-    //!           Numbe rof bytes counter
-    //! \param    [in] setToKey
-    //!           Specify if it's key frame
-    //! \return   MOS_STATUS
-    //!           MOS_STATUS_SUCCESS if success, else fail reason
-    //!
-    MOS_STATUS SetDefaultUVModeProbs(
-        uint8_t * ctxBuffer,
-        uint32_t &byteCnt,
-        bool      setToKey) const;
-
     //!
     //! \brief      Get reference buffer slot index
     //! \param      [in] refreshFlags
diff --git a/media_softlet/agnostic/common/os/mos_utilities_next.cpp b/media_softlet/agnostic/common/os/mos_utilities_next.cpp
index 773ba879..00592006 100644
--- a/media_softlet/agnostic/common/os/mos_utilities_next.cpp
+++ b/media_softlet/agnostic/common/os/mos_utilities_next.cpp
@@ -400,7 +400,7 @@ void *MosUtilities::MosReallocMemory(
     size_t     newSize)
 #endif // MOS_MESSAGES_ENABLED
 {
-    void *oldPtr = nullptr;
+    uintptr_t oldPtr = reinterpret_cast<uintptr_t>(nullptr);
     void *newPtr = nullptr;
 
 #if (_DEBUG || _RELEASE_INTERNAL)
@@ -410,14 +410,14 @@ void *MosUtilities::MosReallocMemory(
     }
 #endif
 
-    oldPtr = ptr;
+    oldPtr = reinterpret_cast<uintptr_t>(ptr);
     newPtr = realloc(ptr, newSize);
 
     MOS_OS_ASSERT(newPtr != nullptr);
 
-    if (newPtr != oldPtr)
+    if (newPtr != reinterpret_cast<void*>(oldPtr))
     {
-        if (oldPtr != nullptr)
+        if (oldPtr != reinterpret_cast<uintptr_t>(nullptr))
         {
             MosAtomicDecrement(&m_mosMemAllocCounter);
             MOS_MEMNINJA_FREE_MESSAGE(oldPtr, functionName, filename, line);
diff --git a/media_softlet/agnostic/common/shared/mediacopy/media_copy.cpp b/media_softlet/agnostic/common/shared/mediacopy/media_copy.cpp
index 6cd795f1..d5a854b5 100644
--- a/media_softlet/agnostic/common/shared/mediacopy/media_copy.cpp
+++ b/media_softlet/agnostic/common/shared/mediacopy/media_copy.cpp
@@ -30,6 +30,7 @@
 #include "media_debug_dumper.h"
 #include "mhw_cp_interface.h"
 #include "mos_utilities.h"
+#include "mos_util_debug.h"
 
 MediaCopyBaseState::MediaCopyBaseState():
     m_osInterface(nullptr)
@@ -208,6 +209,70 @@ MOS_STATUS MediaCopyBaseState::CopyEnigneSelect(MCPY_METHOD preferMethod, MCPY_E
     return MOS_STATUS_SUCCESS;
 }
 
+uint32_t GetMinRequiredSurfaceSizeInBytes(uint32_t pitch, uint32_t height, MOS_FORMAT format)
+{
+    uint32_t nBytes = 0;
+    switch (format)
+    {
+    case Format_NV12:
+    case Format_YV12:
+    case Format_I420:
+    case Format_P010:
+    case Format_P016:
+        nBytes = pitch * height + (pitch >> 1) * (height >> 1) + (pitch >> 1) * (height >> 1);
+        break;
+    case Format_RGBP:
+    case Format_BGRP:
+        nBytes = pitch * height + pitch * height + pitch * height;
+        break;
+    case Format_Y410:
+    case Format_Y416:
+    case Format_Y210:
+    case Format_Y216:
+    case Format_YUY2:
+    case Format_R5G6B5:
+    case Format_R8G8B8:
+    case Format_A8R8G8B8:
+    case Format_A8B8G8R8:
+    case Format_X8R8G8B8:
+    case Format_X8B8G8R8:
+    case Format_AYUV:
+    case Format_R10G10B10A2:
+    case Format_B10G10R10A2:
+    case Format_P8:
+    case Format_L8:
+        nBytes = pitch * height;
+        break;
+    default:
+        MCPY_ASSERTMESSAGE("Unsupported format!");
+        break;
+    }
+    return nBytes;
+}
+
+MOS_STATUS CheckResourceSizeValidForCopy(MOS_SURFACE& res)
+{
+    if (res.TileType != MOS_TILE_LINEAR)
+    {
+        return MOS_STATUS_SUCCESS;
+    }
+
+    uint32_t nBytes = GetMinRequiredSurfaceSizeInBytes(res.dwPitch, res.dwHeight, res.Format);
+    if (nBytes == 0)
+    {
+        return MOS_STATUS_INVALID_PARAMETER;
+    }
+    if (res.dwSize < nBytes)
+    {
+        MT_ERR2(MT_MEDIA_COPY, 
+        MT_MEDIA_COPY_DATASIZE, nBytes,
+        MT_MEDIA_COPY_DATASIZE, res.dwSize);
+
+        return MOS_STATUS_INVALID_PARAMETER;
+    }
+    return MOS_STATUS_SUCCESS;
+}
+
 //!
 //! \brief    surface copy func.
 //! \details  copy surface.
@@ -237,6 +302,15 @@ MOS_STATUS MediaCopyBaseState::SurfaceCopy(PMOS_RESOURCE src, PMOS_RESOURCE dst,
     mcpySrc.OsRes           = src;
     MCPY_NORMALMESSAGE("input surface's format %d, width %d; hight %d, pitch %d, tiledmode %d, mmc mode %d",
         ResDetails.Format, ResDetails.dwWidth, ResDetails.dwHeight, ResDetails.dwPitch, mcpySrc.TileMode, mcpySrc.CompressionMode);
+    MT_LOG7(MT_MEDIA_COPY, MT_NORMAL, 
+        MT_SURF_PITCH,          ResDetails.dwPitch, 
+        MT_SURF_HEIGHT,         ResDetails.dwHeight, 
+        MT_SURF_WIDTH,          ResDetails.dwWidth, 
+        MT_SURF_MOS_FORMAT,     ResDetails.Format, 
+        MT_MEDIA_COPY_DATASIZE, ResDetails.dwSize,
+        MT_SURF_TILE_TYPE,      ResDetails.TileType,
+        MT_SURF_COMP_MODE,      mcpySrc.CompressionMode);
+    MCPY_CHK_STATUS_RETURN(CheckResourceSizeValidForCopy(ResDetails));
 
     MOS_ZeroMemory(&ResDetails, sizeof(MOS_SURFACE));
     ResDetails.Format = Format_Invalid;
@@ -247,6 +321,15 @@ MOS_STATUS MediaCopyBaseState::SurfaceCopy(PMOS_RESOURCE src, PMOS_RESOURCE dst,
     mcpyDst.OsRes           = dst;
     MCPY_NORMALMESSAGE("Output surface's format %d, width %d; hight %d, pitch %d, tiledmode %d, mmc mode %d",
         ResDetails.Format, ResDetails.dwWidth, ResDetails.dwHeight, ResDetails.dwPitch, mcpyDst.TileMode, mcpyDst.CompressionMode);
+    MT_LOG7(MT_MEDIA_COPY, MT_NORMAL, 
+        MT_SURF_PITCH,          ResDetails.dwPitch, 
+        MT_SURF_HEIGHT,         ResDetails.dwHeight, 
+        MT_SURF_WIDTH,          ResDetails.dwWidth, 
+        MT_SURF_MOS_FORMAT,     ResDetails.Format, 
+        MT_MEDIA_COPY_DATASIZE, ResDetails.dwSize,
+        MT_SURF_TILE_TYPE,      ResDetails.TileType,
+        MT_SURF_COMP_MODE,      mcpyDst.CompressionMode);
+    MCPY_CHK_STATUS_RETURN(CheckResourceSizeValidForCopy(ResDetails));
 
     MCPY_CHK_STATUS_RETURN(PreCheckCpCopy(mcpySrc, mcpyDst, preferMethod));
 
diff --git a/media_softlet/agnostic/common/shared/profiler/media_perf_profiler.cpp b/media_softlet/agnostic/common/shared/profiler/media_perf_profiler.cpp
index ed54cc2b..05d26211 100644
--- a/media_softlet/agnostic/common/shared/profiler/media_perf_profiler.cpp
+++ b/media_softlet/agnostic/common/shared/profiler/media_perf_profiler.cpp
@@ -720,6 +720,9 @@ PerfGPUNode MediaPerfProfiler::GpuContextToGpuNode(MOS_GPU_CONTEXT context)
         case MOS_GPU_CONTEXT_VEBOX2:
             node = PERF_GPU_NODE_VE;
             break;
+        case MOS_GPU_CONTEXT_BLT:
+            node = PERF_GPU_NODE_BLT;
+            break;
         default:
             node = PERF_GPU_NODE_UNKNOW;
             break;
diff --git a/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_allocator.cpp b/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_allocator.cpp
index 4c5e53a5..a1b5353f 100644
--- a/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_allocator.cpp
+++ b/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_allocator.cpp
@@ -598,6 +598,7 @@ MOS_STATUS VpAllocator::GetSurfaceInfo(VPHAL_SURFACE *surface, VPHAL_GET_SURFACE
     surface->Format          = resDetails.Format;
     surface->bCompressible   = resDetails.bCompressible ? true : false;
     surface->bIsCompressed   = resDetails.bIsCompressed ? true : false;
+    surface->CacheSetting    = resDetails.CacheSetting;
 
     if (IS_RGB32_FORMAT(surface->Format) ||
         IS_RGB16_FORMAT(surface->Format) ||
@@ -695,6 +696,8 @@ MOS_STATUS VpAllocator::GetSurfaceInfo(VP_SURFACE* surface, VPHAL_GET_SURFACE_IN
     surface->osSurface->Format          = resDetails.Format;
     surface->osSurface->bCompressible   = resDetails.bCompressible ? true : false;
     surface->osSurface->bIsCompressed   = resDetails.bIsCompressed ? true : false;
+    surface->osSurface->CacheSetting    = resDetails.CacheSetting;
+
     
     return MOS_STATUS_SUCCESS;
 }
@@ -773,7 +776,8 @@ MOS_STATUS VpAllocator::ReAllocateSurface(
         MOS_TILE_MODE_GMM       tileModeByForce,
         Mos_MemPool             memType,
         bool                    isNotLockable,
-        void *                  systemMemory)
+        void *                  systemMemory,
+        uint32_t                depth)
 {
     VP_FUNC_CALL();
     MOS_STATUS              eStatus = MOS_STATUS_SUCCESS;
@@ -838,6 +842,7 @@ MOS_STATUS VpAllocator::ReAllocateSurface(
 
     allocParams.dwWidth         = width;
     allocParams.dwHeight        = height;
+    allocParams.dwDepth         = depth;
     allocParams.Format          = format;
     allocParams.bIsCompressible = compressible;
     allocParams.CompressionMode = compressionMode;
diff --git a/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_allocator.h b/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_allocator.h
index 352357b4..c632ff0e 100644
--- a/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_allocator.h
+++ b/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_allocator.h
@@ -386,7 +386,8 @@ public:
         MOS_TILE_MODE_GMM       tileModeByForce = MOS_TILE_UNSET_GMM,
         Mos_MemPool             memType = MOS_MEMPOOL_VIDEOMEMORY,
         bool                    isNotLockable = false,
-        void                    *systemMemory = nullptr);
+        void                    *systemMemory = nullptr,
+        uint32_t                depth = 0);
 
     //!
     //! \brief    Allocates the Surface
diff --git a/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_hdr_resource_manager.cpp b/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_hdr_resource_manager.cpp
index bb57214b..5c0235f5 100644
--- a/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_hdr_resource_manager.cpp
+++ b/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_hdr_resource_manager.cpp
@@ -137,7 +137,7 @@ MOS_STATUS VphdrResourceManager::AssignRenderResource(VP_EXECUTE_CAPS &caps, std
     {
         surfSetting.surfGroup.insert(std::make_pair((SurfaceType)(SurfaceTypeHdrInputLayer0 + i), inputSurfaces[i]));
 
-        SwFilterHdr *hdr = dynamic_cast<SwFilterHdr *>(executedFilters.GetSwFilter(true, i, FeatureType::FeatureTypeHdrOnRender));
+        SwFilterHdr    *hdr    = dynamic_cast<SwFilterHdr *>(executedFilters.GetSwFilter(true, i, FeatureType::FeatureTypeHdrOnRender));
         FeatureParamHdr params = {};
         if (hdr)
         {
@@ -172,10 +172,10 @@ MOS_STATUS VphdrResourceManager::AssignRenderResource(VP_EXECUTE_CAPS &caps, std
         surfSetting.surfGroup.insert(std::make_pair((SurfaceType)(SurfaceTypeHdrOETF1DLUTSurface0 + i), m_hdrOETF1DLUTSurface[i]));
     }
 
-    dwWidth = dwHeight = VPHAL_HDR_CRI_3DLUT_SIZE;
+    dwWidth = dwHeight = dwDepth = VPHAL_HDR_CRI_3DLUT_SIZE;
     for (size_t i = 0; i < VPHAL_MAX_HDR_INPUT_LAYER; ++i)
     {
-        SwFilterHdr *hdr = dynamic_cast<SwFilterHdr *>(executedFilters.GetSwFilter(true, i, FeatureType::FeatureTypeHdrOnRender));
+        SwFilterHdr    *hdr    = dynamic_cast<SwFilterHdr *>(executedFilters.GetSwFilter(true, i, FeatureType::FeatureTypeHdrOnRender));
         FeatureParamHdr params = {};
         if (hdr)
         {
@@ -190,7 +190,7 @@ MOS_STATUS VphdrResourceManager::AssignRenderResource(VP_EXECUTE_CAPS &caps, std
              m_hdrCri3DLUTSurface[i],
              "Cri3DLUTSurface",
              params.bGpuGenerate3DLUT ? Format_R10G10B10A2 : Format_A16B16G16R16,
-             MOS_GFXRES_2D,
+             MOS_GFXRES_VOLUME,
              MOS_TILE_LINEAR,
              dwWidth,
              dwHeight,
@@ -199,7 +199,12 @@ MOS_STATUS VphdrResourceManager::AssignRenderResource(VP_EXECUTE_CAPS &caps, std
              allocated,
              false,
              deferredDestroyed,
-             MOS_HW_RESOURCE_USAGE_VP_INTERNAL_READ_RENDER));
+             MOS_HW_RESOURCE_USAGE_VP_INTERNAL_READ_RENDER,
+             MOS_TILE_UNSET_GMM,
+             MOS_MEMPOOL_VIDEOMEMORY,
+             false,
+             nullptr,
+             dwDepth));
 
          surfSetting.Cri3DLUTAllocated = allocated;
          surfSetting.surfGroup.insert(std::make_pair((SurfaceType)(SurfaceTypeHdrCRI3DLUTSurface0 + i), m_hdrCri3DLUTSurface[i]));
diff --git a/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_resource_manager.cpp b/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_resource_manager.cpp
index 2276f65c..a7175b6c 100644
--- a/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_resource_manager.cpp
+++ b/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_resource_manager.cpp
@@ -150,11 +150,12 @@ extern const VEBOX_SPATIAL_ATTRIBUTES_CONFIGURATION g_cInit_VEBOX_SPATIAL_ATTRIB
     }
 };
 
-VpResourceManager::VpResourceManager(MOS_INTERFACE &osInterface, VpAllocator &allocator, VphalFeatureReport &reporting, vp::VpPlatformInterface &vpPlatformInterface, MediaCopyWrapper *mediaCopyWrapper)
+VpResourceManager::VpResourceManager(MOS_INTERFACE &osInterface, VpAllocator &allocator, VphalFeatureReport &reporting, vp::VpPlatformInterface &vpPlatformInterface, MediaCopyWrapper *mediaCopyWrapper, vp::VpUserFeatureControl *vpUserFeatureControl)
     : m_osInterface(osInterface), m_allocator(allocator), m_reporting(reporting), m_vpPlatformInterface(vpPlatformInterface), m_mediaCopyWrapper(mediaCopyWrapper)
 {
     InitSurfaceConfigMap();
     m_userSettingPtr = m_osInterface.pfnGetUserSettingInstance(&m_osInterface);
+    m_vpUserFeatureControl = vpUserFeatureControl;
 }
 
 VpResourceManager::~VpResourceManager()
@@ -226,11 +227,6 @@ VpResourceManager::~VpResourceManager()
         m_allocator.DestroyVpSurface(m_temperalInput);
     }
 
-    if (m_internalInput)
-    {
-        m_allocator.DestroyVpSurface(m_internalInput);
-    }
-
     if (m_hdrResourceManager)
     {
         MOS_Delete(m_hdrResourceManager);
@@ -626,6 +622,8 @@ void VpResourceManager::InitSurfaceConfigMap()
     AddSurfaceConfig(true,  true,  false, false, true,  false, false, VEBOX_SURFACE_INPUT,  VEBOX_SURFACE_PAST_REF, VEBOX_SURFACE_FRAME1, VEBOX_SURFACE_FRAME0);
     AddSurfaceConfig(true,  true,  true,  false, false, false, true,  VEBOX_SURFACE_INPUT,  VEBOX_SURFACE_NULL,     VEBOX_SURFACE_FRAME1, VEBOX_SURFACE_NULL);
     AddSurfaceConfig(true,  true,  true,  false, false, false, false, VEBOX_SURFACE_INPUT,  VEBOX_SURFACE_NULL,     VEBOX_SURFACE_FRAME1, VEBOX_SURFACE_NULL);
+    AddSurfaceConfig(true,  true,  true,  false, true,  false, true,  VEBOX_SURFACE_INPUT,  VEBOX_SURFACE_PAST_REF, VEBOX_SURFACE_FRAME1, VEBOX_SURFACE_FRAME0);
+
     // outOfBound
     AddSurfaceConfig(true,  true,  false, true,  true,  false, true,  VEBOX_SURFACE_INPUT,  VEBOX_SURFACE_PAST_REF, VEBOX_SURFACE_FRAME1, VEBOX_SURFACE_FRAME0);
     AddSurfaceConfig(true,  true,  false, true,  true,  false, false, VEBOX_SURFACE_INPUT,  VEBOX_SURFACE_NULL,     VEBOX_SURFACE_FRAME1, VEBOX_SURFACE_NULL);
@@ -691,20 +689,6 @@ MOS_STATUS VpResourceManager::GetResourceHint(std::vector<FeatureType> &featureP
     return MOS_STATUS_SUCCESS;
 }
 
-struct VP_SURFACE_PARAMS
-{
-    uint32_t                width               = 0;
-    uint32_t                height              = 0;
-    MOS_FORMAT              format              = Format_None;
-    MOS_TILE_TYPE           tileType            = MOS_TILE_X;
-    MOS_RESOURCE_MMC_MODE   surfCompressionMode = MOS_MMC_DISABLED;
-    bool                    surfCompressible    = false;
-    VPHAL_CSPACE            colorSpace          = CSpace_None;
-    RECT                    rcSrc               = {0, 0, 0, 0};  //!< Source rectangle
-    RECT                    rcDst               = {0, 0, 0, 0};  //!< Destination rectangle
-    RECT                    rcMaxSrc            = {0, 0, 0, 0};  //!< Max source rectangle
-    VPHAL_SAMPLE_TYPE       sampleType          = SAMPLE_PROGRESSIVE;
-};
 MOS_STATUS VpResourceManager::GetIntermediaColorAndFormat3DLutOutput(VPHAL_CSPACE &colorSpace, MOS_FORMAT &format, SwFilterPipe &executedFilters)
 {
     SwFilterHdr *hdr = dynamic_cast<SwFilterHdr *>(executedFilters.GetSwFilter(true, 0, FeatureType::FeatureTypeHdr));
@@ -914,6 +898,7 @@ MOS_STATUS VpResourceManager::AssignIntermediaSurface(VP_EXECUTE_CAPS& caps, SwF
 
     VP_SURFACE *outputSurface = executedFilters.GetSurface(false, 0);
     VP_SURFACE *intermediaSurface = nullptr;
+    VP_SURFACE_PARAMS params            = {};
     if (outputSurface)
     {
         // No need intermedia surface.
@@ -930,7 +915,6 @@ MOS_STATUS VpResourceManager::AssignIntermediaSurface(VP_EXECUTE_CAPS& caps, SwF
         {
             m_intermediaSurfaces.push_back(nullptr);
         }
-        VP_SURFACE_PARAMS params = {};
         bool allocated = false;
         // Get surface parameter.
         GetIntermediaOutputSurfaceParams(caps, params, executedFilters);
@@ -1027,14 +1011,7 @@ MOS_STATUS VpResourceManager::AssignFcResources(VP_EXECUTE_CAPS &caps, std::vect
     {
         for (size_t i = 0; i < inputSurfaces.size(); ++i)
         {
-            if (caps.bInternalInputInuse && i==0)
-            {
-                surfSetting.surfGroup.insert(std::make_pair((SurfaceType)(SurfaceTypeFcInputLayer0 + i), m_internalInput));
-            }
-            else
-            {
-                surfSetting.surfGroup.insert(std::make_pair((SurfaceType)(SurfaceTypeFcInputLayer0 + i), inputSurfaces[i]));
-            }
+            surfSetting.surfGroup.insert(std::make_pair((SurfaceType)(SurfaceTypeFcInputLayer0 + i), inputSurfaces[i]));
 
             if (!resHint.isIScalingTypeNone)
             {
@@ -1104,11 +1081,6 @@ MOS_STATUS VpResourceManager::AssignRenderResource(VP_EXECUTE_CAPS &caps, std::v
     if (caps.bComposite)
     {
         VP_PUBLIC_CHK_STATUS_RETURN(AssignFcResources(caps, inputSurfaces, outputSurface, pastSurfaces, futureSurfaces, resHint, surfSetting));
-        if (caps.bInternalInputInuse)
-        {
-            m_internalInput->ColorSpace = inputSurfaces[0]->ColorSpace;
-            executedFilters.AddSurface(m_internalInput, true, 0);
-        }
     }
     else if (caps.b3DLutCalc)
     {
@@ -1338,15 +1310,23 @@ MOS_STATUS VpResourceManager::ReAllocateVeboxOutputSurface(VP_EXECUTE_CAPS& caps
                                             outputSurface->osSurface->Format, veboxOutputFormat, veboxOutputTileType));
 
     allocated = false;
-    if (IS_VP_VEBOX_DN_ONLY(caps))
+
+    bool enableVeboxOutputSurf = false;
+    if (m_vpUserFeatureControl)
     {
-        bSurfCompressible = inputSurface->osSurface->bCompressible;
+        enableVeboxOutputSurf = m_vpUserFeatureControl->IsVeboxOutputSurfEnabled();
+    }
+
+    if (enableVeboxOutputSurf || IS_VP_VEBOX_DN_ONLY(caps))
+    {
+        bSurfCompressible   = inputSurface->osSurface->bCompressible;
         surfCompressionMode = inputSurface->osSurface->CompressionMode;
     }
     else
     {
-        bSurfCompressible = true;
+        bSurfCompressible   = true;
         surfCompressionMode = MOS_MMC_MC;
+
     }
 
     if (m_currentFrameIds.pastFrameAvailable && m_currentFrameIds.futureFrameAvailable)
@@ -1355,6 +1335,8 @@ MOS_STATUS VpResourceManager::ReAllocateVeboxOutputSurface(VP_EXECUTE_CAPS& caps
         m_veboxOutputCount = 4;
     }
 
+    bool isVppInterResourceLocakable = enableVeboxOutputSurf ? VPP_INTER_RESOURCE_LOCKABLE : VPP_INTER_RESOURCE_NOTLOCKABLE;
+
     for (i = 0; i < m_veboxOutputCount; i++)
     {
         VP_PUBLIC_CHK_STATUS_RETURN(m_allocator.ReAllocateSurface(
@@ -1373,7 +1355,7 @@ MOS_STATUS VpResourceManager::ReAllocateVeboxOutputSurface(VP_EXECUTE_CAPS& caps
             MOS_HW_RESOURCE_USAGE_VP_OUTPUT_PICTURE_FF,
             MOS_TILE_UNSET_GMM,
             memTypeSurfVideoMem,
-            VPP_INTER_RESOURCE_NOTLOCKABLE));
+            isVppInterResourceLocakable));
 
         m_veboxOutput[i]->ColorSpace = inputSurface->ColorSpace;
         m_veboxOutput[i]->rcDst      = inputSurface->rcDst;
@@ -2211,6 +2193,12 @@ VP_SURFACE* VpResourceManager::GetVeboxOutputSurface(VP_EXECUTE_CAPS& caps, VP_S
 {
     VP_FUNC_CALL();
 
+    bool enableVeboxOutputSurf = false;
+    if (m_vpUserFeatureControl)
+    {
+        enableVeboxOutputSurf = m_vpUserFeatureControl->IsVeboxOutputSurfEnabled();
+    }
+
     if (caps.bRender)
     {
         // Place Holder when enable DI
@@ -2231,7 +2219,7 @@ VP_SURFACE* VpResourceManager::GetVeboxOutputSurface(VP_EXECUTE_CAPS& caps, VP_S
     {
         return m_veboxOutput[m_currentDnOutput];
     }
-    else if (caps.bDN) // SFC + DN case
+    else if (enableVeboxOutputSurf || caps.bDN)  // SFC + DN case
     {
         // DN + SFC scenario needs IECP implicitly, which need vebox output surface being assigned.
         // Use m_currentDnOutput to ensure m_veboxOutput surface paired with DN output surface.
@@ -2260,11 +2248,17 @@ MOS_STATUS VpResourceManager::InitVeboxSpatialAttributesConfiguration()
 bool VpResourceManager::VeboxOutputNeeded(VP_EXECUTE_CAPS& caps)
 {
     VP_FUNC_CALL();
+    bool enableVeboxOutputSurf = false;
+    if (m_vpUserFeatureControl)
+    {
+        enableVeboxOutputSurf = m_vpUserFeatureControl->IsVeboxOutputSurfEnabled();
+    }
 
     // If DN and/or Hotpixel are the only functions enabled then the only output is the Denoised Output
     // and no need vebox output.
     // For any other vebox features being enabled, vebox output surface is needed.
-    if (caps.bDI                ||
+    if (enableVeboxOutputSurf   ||
+        caps.bDI                ||
         caps.bQueryVariance     ||
         caps.bDiProcess2ndField ||
         caps.bIECP              ||
diff --git a/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_resource_manager.h b/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_resource_manager.h
index 84be096e..da70bfbd 100644
--- a/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_resource_manager.h
+++ b/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_resource_manager.h
@@ -333,12 +333,27 @@ struct VP_FRAME_IDS
     int32_t     pastFrameId;
     int32_t     futureFrameId;
 };
-struct VP_SURFACE_PARAMS;
+
+struct VP_SURFACE_PARAMS
+{
+    uint32_t              width               = 0;
+    uint32_t              height              = 0;
+    MOS_FORMAT            format              = Format_None;
+    MOS_TILE_TYPE         tileType            = MOS_TILE_X;
+    MOS_RESOURCE_MMC_MODE surfCompressionMode = MOS_MMC_DISABLED;
+    bool                  surfCompressible    = false;
+    VPHAL_CSPACE          colorSpace          = CSpace_None;
+    RECT                  rcSrc               = {0, 0, 0, 0};  //!< Source rectangle
+    RECT                  rcDst               = {0, 0, 0, 0};  //!< Destination rectangle
+    RECT                  rcMaxSrc            = {0, 0, 0, 0};  //!< Max source rectangle
+    VPHAL_SAMPLE_TYPE     sampleType          = SAMPLE_PROGRESSIVE;
+    VPHAL_SURFACE_TYPE    surfType            = SURF_NONE;
+};
 
 class VpResourceManager
 {
 public:
-    VpResourceManager(MOS_INTERFACE &osInterface, VpAllocator &allocator, VphalFeatureReport &reporting, vp::VpPlatformInterface &vpPlatformInterface, MediaCopyWrapper *mediaCopyWrapper);
+    VpResourceManager(MOS_INTERFACE &osInterface, VpAllocator &allocator, VphalFeatureReport &reporting, vp::VpPlatformInterface &vpPlatformInterface, MediaCopyWrapper *mediaCopyWrapper, vp::VpUserFeatureControl *vpUserFeatureControl);
     virtual ~VpResourceManager();
     virtual MOS_STATUS OnNewFrameProcessStart(SwFilterPipe &pipe);
     virtual void OnNewFrameProcessEnd();
@@ -453,7 +468,7 @@ protected:
 
     virtual MOS_STATUS GetIntermediaColorAndFormat3DLutOutput(VPHAL_CSPACE &colorSpace, MOS_FORMAT &format, SwFilterPipe &executedFilters);
     virtual MOS_STATUS GetIntermediaColorAndFormatBT2020toRGB(VP_EXECUTE_CAPS &caps, VPHAL_CSPACE &colorSpace, MOS_FORMAT &format, SwFilterPipe &executedFilters);
-    MOS_STATUS GetIntermediaOutputSurfaceParams(VP_EXECUTE_CAPS& caps, VP_SURFACE_PARAMS &params, SwFilterPipe &executedFilters);
+    virtual MOS_STATUS GetIntermediaOutputSurfaceParams(VP_EXECUTE_CAPS& caps, VP_SURFACE_PARAMS &params, SwFilterPipe &executedFilters);
     MOS_STATUS         GetIntermediaOutputSurfaceColorAndFormat(VP_EXECUTE_CAPS &caps, SwFilterPipe &executedFilters, MOS_FORMAT &format, VPHAL_CSPACE &colorSpace);
     MOS_STATUS AssignIntermediaSurface(VP_EXECUTE_CAPS& caps, SwFilterPipe &executedFilters);
 
@@ -480,6 +495,7 @@ protected:
     VpAllocator                  &m_allocator;
     VphalFeatureReport           &m_reporting;
     vp::VpPlatformInterface      &m_vpPlatformInterface;
+    vp::VpUserFeatureControl     *m_vpUserFeatureControl = nullptr;
 
     // Vebox Resource
     VP_SURFACE* m_veboxDenoiseOutput[VP_NUM_DN_SURFACES]     = {};            //!< Vebox Denoise output surface
@@ -531,7 +547,6 @@ protected:
     VP_SURFACE *m_veboxWeitCoefSurface                        = nullptr;       //!< VEBOX 1D LUT surface for Vebox Gen12
     VP_SURFACE *m_veboxGlobalToneMappingCurveLUTSurface       = nullptr;       //!< VEBOX 1D LUT surface for Vebox Gen12
     VP_SURFACE *m_temperalInput                               = nullptr;
-    VP_SURFACE *m_internalInput                               = nullptr;
 
     // Fc Resource
     VP_SURFACE *m_cmfcCoeff                                   = nullptr;
diff --git a/media_softlet/agnostic/common/vp/hal/feature_manager/policy.cpp b/media_softlet/agnostic/common/vp/hal/feature_manager/policy.cpp
index 8af1535f..5192619c 100644
--- a/media_softlet/agnostic/common/vp/hal/feature_manager/policy.cpp
+++ b/media_softlet/agnostic/common/vp/hal/feature_manager/policy.cpp
@@ -2190,7 +2190,6 @@ MOS_STATUS Policy::InitExecuteCaps(VP_EXECUTE_CAPS &caps, VP_EngineEntry &engine
     else if (engineCapsInputPipe.isolated)
     {
         caps.bTemperalInputInuse = engineCapsInputPipe.bTemperalInputInuse;
-        caps.bInternalInputInuse = engineCapsInputPipe.bInternalInputInuse;
         if (engineCapsInputPipe.VeboxNeeded != 0 || engineCapsInputPipe.SfcNeeded != 0)
         {
             caps.bVebox = true;
@@ -2232,7 +2231,6 @@ MOS_STATUS Policy::InitExecuteCaps(VP_EXECUTE_CAPS &caps, VP_EngineEntry &engine
         caps.bIECP = engineCaps.VeboxIECPNeeded;
         caps.bDiProcess2ndField = engineCaps.diProcess2ndField;
         caps.bTemperalInputInuse = engineCaps.bTemperalInputInuse;
-        caps.bInternalInputInuse = engineCaps.bInternalInputInuse;
 
         if (engineCaps.fcOnlyFeatureExists)
         {
@@ -2286,7 +2284,6 @@ MOS_STATUS Policy::InitExecuteCaps(VP_EXECUTE_CAPS &caps, VP_EngineEntry &engine
 
         caps.bDiProcess2ndField = engineCaps.diProcess2ndField;
         caps.bTemperalInputInuse = engineCaps.bTemperalInputInuse;
-        caps.bInternalInputInuse = engineCaps.bInternalInputInuse;
     }
 
     VP_PUBLIC_NORMALMESSAGE("Execute Caps, value 0x%llx (bVebox %d, bSFC %d, bRender %d, bComposite %d, bOutputPipeFeatureInuse %d, bIECP %d, bForceCscToRender %d, bDiProcess2ndField %d)",
diff --git a/media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter.cpp b/media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter.cpp
index 151c76ca..1e13f654 100644
--- a/media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter.cpp
+++ b/media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter.cpp
@@ -615,10 +615,7 @@ MOS_STATUS SwFilterScaling::Update(VP_SURFACE *inputSurf, VP_SURFACE *outputSurf
     m_Params.csc.colorSpaceOutput   = outputSurf->ColorSpace;
 
     if (rotMir &&
-        (rotMir->GetSwFilterParams().rotation == VPHAL_ROTATION_90 ||
-        rotMir->GetSwFilterParams().rotation == VPHAL_ROTATION_270 ||
-        rotMir->GetSwFilterParams().rotation == VPHAL_ROTATE_90_MIRROR_VERTICAL ||
-        rotMir->GetSwFilterParams().rotation == VPHAL_ROTATE_90_MIRROR_HORIZONTAL))
+        VpUtils::IsVerticalRotation(rotMir->GetSwFilterParams().rotation))
     {
         m_Params.rotation.rotationNeeded = true;
 
@@ -1338,7 +1335,7 @@ MOS_STATUS SwFilterHdr::Configure(VP_PIPELINE_PARAMS &params, bool isInputSurf,
     }
     else
     {
-        CurrentLUTMode = VPHAL_HDR_LUT_MODE_2D;
+        CurrentLUTMode = VPHAL_HDR_LUT_MODE_3D;
     }
 
     // Neither 1D nor 3D LUT is needed in linear output case.
diff --git a/media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter.h b/media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter.h
index 3717c359..5e9c5ed9 100644
--- a/media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter.h
+++ b/media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter.h
@@ -696,7 +696,6 @@ enum SurfaceType
 
     // SR
     SurfaceTypeSRLumaInputSurf,
-    SurfaceTypeSRTempOutputSurf,
     SurfaceTypeSRTempLumaOutput,
     SurfaceTypeSRTempLumaOutputEnd = SurfaceTypeSRTempLumaOutput + SURFACETYPE_SIZE32,
     SurfaceTypeSRTempLuma2Output,
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_render_cmd_packet.cpp b/media_softlet/agnostic/common/vp/hal/packet/vp_render_cmd_packet.cpp
index d804c758..1da8f5c5 100644
--- a/media_softlet/agnostic/common/vp/hal/packet/vp_render_cmd_packet.cpp
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_render_cmd_packet.cpp
@@ -1608,6 +1608,10 @@ MOS_STATUS VpRenderCmdPacket::SubmitWithMultiKernel(MOS_COMMAND_BUFFER *commandB
 
     RENDER_PACKET_CHK_STATUS_RETURN(SetPowerMode(kernelCombinedFc));
 
+    m_renderHal->pRenderHalPltInterface->On1stLevelBBStart(m_renderHal, commandBuffer, pOsContext, pOsInterface->CurrentGpuContextHandle, pMmioRegisters);
+
+    OcaDumpDbgInfo(*commandBuffer, *pOsContext);
+
     RENDER_PACKET_CHK_STATUS_RETURN(SetMediaFrameTracking(GenericPrologParams));
 
     // Initialize command buffer and insert prolog
@@ -1615,6 +1619,8 @@ MOS_STATUS VpRenderCmdPacket::SubmitWithMultiKernel(MOS_COMMAND_BUFFER *commandB
 
     RENDER_PACKET_CHK_STATUS_RETURN(m_renderHal->pRenderHalPltInterface->AddPerfCollectStartCmd(m_renderHal, pOsInterface, commandBuffer));
 
+    RENDER_PACKET_CHK_STATUS_RETURN(m_renderHal->pRenderHalPltInterface->StartPredicate(m_renderHal, commandBuffer));
+
     // Write timing data for 3P budget
     RENDER_PACKET_CHK_STATUS_RETURN(m_renderHal->pfnSendTimingData(m_renderHal, commandBuffer, true));
 
@@ -1633,6 +1639,8 @@ MOS_STATUS VpRenderCmdPacket::SubmitWithMultiKernel(MOS_COMMAND_BUFFER *commandB
         RENDER_PACKET_CHK_STATUS_RETURN(m_renderHal->pfnSendRcsStatusTag(m_renderHal, commandBuffer));
     }
 
+    RENDER_PACKET_CHK_STATUS_RETURN(m_renderHal->pRenderHalPltInterface->StopPredicate(m_renderHal, commandBuffer));
+
     RENDER_PACKET_CHK_STATUS_RETURN(m_renderHal->pRenderHalPltInterface->AddPerfCollectEndCmd(m_renderHal, pOsInterface, commandBuffer));
 
     // Write timing data for 3P budget
@@ -1682,6 +1690,8 @@ MOS_STATUS VpRenderCmdPacket::SubmitWithMultiKernel(MOS_COMMAND_BUFFER *commandB
         RENDER_PACKET_CHK_STATUS_RETURN(m_renderHal->pRenderHalPltInterface->AddMediaStateFlush(m_renderHal, commandBuffer, &FlushParam));
     }
 
+    HalOcaInterfaceNext::On1stLevelBBEnd(*commandBuffer, *pOsInterface);
+
     if (pBatchBuffer)
     {
         // Send Batch Buffer end command (HW/OS dependent)
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_render_hdr_kernel.cpp b/media_softlet/agnostic/common/vp/hal/packet/vp_render_hdr_kernel.cpp
index 806e4210..349017ea 100644
--- a/media_softlet/agnostic/common/vp/hal/packet/vp_render_hdr_kernel.cpp
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_render_hdr_kernel.cpp
@@ -3069,7 +3069,7 @@ MOS_STATUS VpRenderHdrKernel::UpdatePerLayerPipelineStates(
         }
         else
         {
-            CurrentLUTMode = VPHAL_HDR_LUT_MODE_2D;
+            CurrentLUTMode = VPHAL_HDR_LUT_MODE_3D;
         }
 
         // Neither 1D nor 3D LUT is needed in linear output case.
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_cmd_packet.cpp b/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_cmd_packet.cpp
index c8553f21..773578f1 100644
--- a/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_cmd_packet.cpp
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_cmd_packet.cpp
@@ -1773,8 +1773,14 @@ MOS_STATUS VpVeboxCmdPacket::RenderVeboxCmd(
 
             VP_RENDER_CHK_STATUS_RETURN(m_sfcRender->SetupSfcState(m_renderTarget));
 
+            bool enableVeboxOutputSurf = false;
+            if (m_vpUserFeatureControl)
+            {
+                enableVeboxOutputSurf = m_vpUserFeatureControl->IsVeboxOutputSurfEnabled();
+            }
+
             VP_RENDER_CHK_STATUS_RETURN(m_sfcRender->SendSfcCmd(
-                (pRenderData->DI.bDeinterlace || pRenderData->DN.bDnEnabled),
+                (enableVeboxOutputSurf || pRenderData->DI.bDeinterlace || pRenderData->DN.bDnEnabled),
                 pCmdBufferInUse));
         }
 
@@ -2453,6 +2459,7 @@ VpVeboxCmdPacket::VpVeboxCmdPacket(
     VP_PUBLIC_CHK_NULL_NO_STATUS_RETURN(hwInterface->m_vpPlatformInterface);
     m_veboxItf = hwInterface->m_vpPlatformInterface->GetMhwVeboxItf();
     m_miItf = hwInterface->m_vpPlatformInterface->GetMhwMiItf();
+    m_vpUserFeatureControl = hwInterface->m_userFeatureControl;
 }
 
 VpVeboxCmdPacket:: ~VpVeboxCmdPacket()
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_cmd_packet.h b/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_cmd_packet.h
index 28390413..05de0027 100644
--- a/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_cmd_packet.h
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_cmd_packet.h
@@ -1199,6 +1199,7 @@ protected:
     std::shared_ptr<mhw::vebox::Itf> m_veboxItf            = nullptr;
     MediaFeatureManager        *m_featureManager           = nullptr;
     std::shared_ptr<mhw::mi::Itf> m_miItf                  = nullptr;
+    vp::VpUserFeatureControl   *m_vpUserFeatureControl     = nullptr;
 
 MEDIA_CLASS_DEFINE_END(vp__VpVeboxCmdPacket)
 };
diff --git a/media_softlet/agnostic/common/vp/hal/pipeline/vp_base.cpp b/media_softlet/agnostic/common/vp/hal/pipeline/vp_base.cpp
index 3f5a6329..160d1065 100644
--- a/media_softlet/agnostic/common/vp/hal/pipeline/vp_base.cpp
+++ b/media_softlet/agnostic/common/vp/hal/pipeline/vp_base.cpp
@@ -46,13 +46,14 @@ VpBase::~VpBase()
 VpBase* VpBase::VphalStateFactory(
     PMOS_INTERFACE     osInterface,
     MOS_CONTEXT_HANDLE osDriverContext,
-    MOS_STATUS         *peStatus)
+    MOS_STATUS         *peStatus,
+    bool               clearViewMode)
 {
     VP_FUNC_CALL();
 
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
 
-    VpBase *vpBase = VphalDevice::CreateFactoryNext(osInterface, (PMOS_CONTEXT)osDriverContext, &eStatus);
+    VpBase *vpBase = VphalDevice::CreateFactoryNext(osInterface, (PMOS_CONTEXT)osDriverContext, &eStatus, clearViewMode);
 
     if (peStatus)
     {
diff --git a/media_softlet/agnostic/common/vp/hal/pipeline/vp_base.h b/media_softlet/agnostic/common/vp/hal/pipeline/vp_base.h
index 11a49f52..ed55a6d8 100644
--- a/media_softlet/agnostic/common/vp/hal/pipeline/vp_base.h
+++ b/media_softlet/agnostic/common/vp/hal/pipeline/vp_base.h
@@ -87,7 +87,7 @@ struct VpSettings
     uint32_t kernelUpdate;            //!< For VEBox Copy and Update kernels
     uint32_t disableHdr;              //!< Disable Hdr
     uint32_t veboxParallelExecution;  //!< Control VEBox parallel execution with render engine
-    uint32_t clearVideoViewMode;      //!< Perf Optimize for ClearVideoView DDI
+    bool     clearVideoViewMode;      //!< Perf Optimize for ClearVideoView DDI
 };
 
 struct _VP_MHWINTERFACE
@@ -142,7 +142,8 @@ public:
     static VpBase* VphalStateFactory(
         PMOS_INTERFACE     osInterface,
         MOS_CONTEXT_HANDLE osDriverContext,
-        MOS_STATUS         *eStatus);
+        MOS_STATUS         *eStatus,
+        bool               clearViewMode = false);
 
     //!
     //! \brief    Allocate VpPipelineAdapterBase Resources
diff --git a/media_softlet/agnostic/common/vp/hal/pipeline/vp_feature_report.cpp b/media_softlet/agnostic/common/vp/hal/pipeline/vp_feature_report.cpp
index ea9ca158..b8c3f1fa 100644
--- a/media_softlet/agnostic/common/vp/hal/pipeline/vp_feature_report.cpp
+++ b/media_softlet/agnostic/common/vp/hal/pipeline/vp_feature_report.cpp
@@ -43,6 +43,7 @@ void VpFeatureReport::InitReportValue()
     m_features.vpMMCInUse          = false;
     m_features.rtCompressible      = false;
     m_features.rtCompressMode      = 0;
+    m_features.rtCacheSetting      = 0;
     m_features.ffdiCompressible    = false;
     m_features.ffdiCompressMode    = 0;
     m_features.ffdnCompressible    = false;
@@ -117,6 +118,9 @@ void VpFeatureReport::SetConfigValues(
     configValues->dwPrimaryCompressible = m_features.primaryCompressible;
     configValues->dwPrimaryCompressMode = m_features.primaryCompressMode;
 
+    // Report Render Target cache usage
+    configValues->dwRTCacheSetting     = m_features.rtCacheSetting;
+
     // Report In Place Compositon status
     configValues->dwCurrentCompositionMode = m_features.compositionMode;
     configValues->dwCurrentScdMode         = m_features.diScdMode;
diff --git a/media_softlet/agnostic/common/vp/hal/pipeline/vp_feature_report.h b/media_softlet/agnostic/common/vp/hal/pipeline/vp_feature_report.h
index 8774c12f..e1496d98 100644
--- a/media_softlet/agnostic/common/vp/hal/pipeline/vp_feature_report.h
+++ b/media_softlet/agnostic/common/vp/hal/pipeline/vp_feature_report.h
@@ -69,6 +69,7 @@ public:
         bool                          diScdMode           = false;                        //!< Scene change detection
         VPHAL_HDR_MODE                hdrMode             = VPHAL_HDR_MODE_NONE;          //!< HDR mode
         bool                          packetReused        = false;                        //!< true if packet reused.
+        uint8_t                       rtCacheSetting      = 0;                            //!< Render Target cache usage
     };
 
     virtual ~VpFeatureReport(){};
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 e1031c14..48ce5fc5 100644
--- a/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.cpp
+++ b/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.cpp
@@ -184,6 +184,8 @@ MOS_STATUS VpPipeline::UserFeatureReport()
                 m_reporting->GetFeatures().rtCompressible = true;
                 m_reporting->GetFeatures().rtCompressMode = (uint8_t)(params->pTarget[0]->CompressionMode);
             }
+            
+            m_reporting->GetFeatures().rtCacheSetting = (uint8_t)(params->pTarget[0]->CacheSetting);
         }
     }
 
@@ -260,6 +262,10 @@ MOS_STATUS VpPipeline::Init(void *mhwInterface)
         VP_PUBLIC_CHK_STATUS_RETURN(CreateUserFeatureControl());
         m_vpMhwInterface.m_userFeatureControl = m_userFeatureControl;
     }
+    if (m_userFeatureControl && m_vpMhwInterface.m_settings)
+    {
+        m_userFeatureControl->SetClearVideoViewMode(((VP_SETTINGS *)m_vpMhwInterface.m_settings)->clearVideoViewMode);
+    }
 
     VP_PUBLIC_CHK_STATUS_RETURN(m_vpMhwInterface.m_vpPlatformInterface->ConfigVirtualEngine());
 
@@ -321,10 +327,9 @@ MOS_STATUS VpPipeline::Init(void *mhwInterface)
     VP_PUBLIC_CHK_STATUS_RETURN(SetVideoProcessingSettings(m_vpMhwInterface.m_settings));
 
     m_vpMhwInterface.m_settings = m_vpSettings;
-
     if (m_vpMhwInterface.m_vpPlatformInterface->IsGpuContextCreatedInPipelineInit())
     {
-        if (m_numVebox > 0)
+        if (m_numVebox > 0 && !(m_vpSettings && m_vpSettings->clearVideoViewMode))
         {
             VP_PUBLIC_NORMALMESSAGE("Create GpuContext for Vebox.");
             VP_PUBLIC_CHK_STATUS_RETURN(PacketPipe::SwitchContext(VP_PIPELINE_PACKET_VEBOX, m_scalability,
@@ -1150,7 +1155,7 @@ MOS_STATUS VpSinglePipeContext::CreateResourceManager(PMOS_INTERFACE osInterface
     VP_FUNC_CALL();
     if (nullptr == m_resourceManager)
     {
-        m_resourceManager = MOS_New(VpResourceManager, *osInterface, *allocator, *reporting, *vpPlatformInterface, mediaCopyWrapper);
+        m_resourceManager = MOS_New(VpResourceManager, *osInterface, *allocator, *reporting, *vpPlatformInterface, mediaCopyWrapper, userFeatureControl);
         VP_PUBLIC_CHK_NULL_RETURN(m_resourceManager);
     }
     
diff --git a/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline_adapter_base.cpp b/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline_adapter_base.cpp
index 00ea602e..920581ab 100644
--- a/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline_adapter_base.cpp
+++ b/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline_adapter_base.cpp
@@ -34,7 +34,8 @@
 
 VpPipelineAdapterBase::VpPipelineAdapterBase(
     vp::VpPlatformInterface &vpPlatformInterface,
-    MOS_STATUS              &eStatus):
+    MOS_STATUS              &eStatus,
+    bool                    clearViewMode) :
     m_vpPlatformInterface(vpPlatformInterface)
 {
     m_osInterface = m_vpPlatformInterface.GetOsInterface();
@@ -42,7 +43,11 @@ VpPipelineAdapterBase::VpPipelineAdapterBase(
     {
         m_userSettingPtr = m_osInterface->pfnGetUserSettingInstance(m_osInterface);
     }
-    VpUserSetting::InitVpUserSetting(m_userSettingPtr);
+    if (!clearViewMode)
+    {
+        VpUserSetting::InitVpUserSetting(m_userSettingPtr);
+    }
+
     eStatus = MOS_STATUS_SUCCESS;
 }
 
@@ -50,6 +55,7 @@ MOS_STATUS VpPipelineAdapterBase::GetVpMhwInterface(
     VP_MHWINTERFACE &vpMhwinterface)
 {
     VP_FUNC_CALL();
+
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
     bool       sfcNeeded                          = false;
     bool       veboxNeeded                        = false;
@@ -89,14 +95,14 @@ MOS_STATUS VpPipelineAdapterBase::GetVpMhwInterface(
 
     veboxNeeded = MEDIA_IS_SKU(m_skuTable, FtrVERing);
     sfcNeeded   = MEDIA_IS_SKU(m_skuTable, FtrSFCPipe);
-    if (veboxNeeded || sfcNeeded)
+    SetMhwMiItf(m_vprenderHal->pRenderHalPltInterface->GetMhwMiItf());
+    if ((veboxNeeded || sfcNeeded) && !m_clearVideoViewMode)
     {
         eStatus = VphalDevice::CreateVPMhwInterfaces(sfcNeeded, veboxNeeded, veboxItf, sfcItf, miItf, m_osInterface);
         if (eStatus == MOS_STATUS_SUCCESS)
         {
             SetMhwVeboxItf(veboxItf);
             SetMhwSfcItf(sfcItf);
-            SetMhwMiItf(m_vprenderHal->pRenderHalPltInterface->GetMhwMiItf());
         }
         else
         {
diff --git a/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline_adapter_base.h b/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline_adapter_base.h
index 8214d43b..e28e2bd0 100644
--- a/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline_adapter_base.h
+++ b/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline_adapter_base.h
@@ -74,7 +74,8 @@ public:
     //!
     VpPipelineAdapterBase(
         vp::VpPlatformInterface &vpPlatformInterface,
-        MOS_STATUS &eStatus);
+        MOS_STATUS &eStatus,
+        bool       clearViewMode = false);
 
     virtual MOS_STATUS GetVpMhwInterface(
         VP_MHWINTERFACE &vpMhwinterface);
@@ -235,7 +236,9 @@ protected:
     vp::VpPlatformInterface &m_vpPlatformInterface;  //!< vp platform interface. Should be destroyed during deconstruction.
     MediaUserSettingSharedPtr m_userSettingPtr = nullptr;  //!< usersettingInstance
 
-MEDIA_CLASS_DEFINE_END(VpPipelineAdapterBase)
+    // Perf Optimize for ClearVideoView DDI
+    bool m_clearVideoViewMode = false;
+    MEDIA_CLASS_DEFINE_END(VpPipelineAdapterBase)
 };
 
 #endif  // __VP_PIPELINE_ADAPTER_BASE_H__
diff --git a/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline_common.h b/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline_common.h
index cd0400a6..15c83e83 100644
--- a/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline_common.h
+++ b/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline_common.h
@@ -129,6 +129,7 @@ struct _VP_SETTINGS
     uint32_t               kernelUpdate           = 0;                   //!< For VEBox Copy and Update kernels
     uint32_t               disableHdr             = 0;                   //!< Disable Hdr
     uint32_t               veboxParallelExecution = 0;                   //!< Control VEBox parallel execution with render engine
+    bool                   clearVideoViewMode     = 0;                   //!< Perf Optimize for ClearVideoView DDI
 };
 
 using VP_SETTINGS = _VP_SETTINGS;
@@ -149,7 +150,6 @@ struct _VP_EXECUTE_CAPS
             uint64_t bForceProcampToRender : 1;   // If true, force to use render for procamp.
             uint64_t lastSubmission : 1;    // If true, it's the last submission of current DDI.
             uint64_t bTemperalInputInuse : 1; // If true, will use temperal input instead of input
-            uint64_t bInternalInputInuse : 1; // If true, will use internal input instead of input
 
             // Vebox Features
             uint64_t bDN            : 1;   // Vebox DN needed
@@ -240,7 +240,6 @@ typedef struct _VP_EngineEntry
             uint32_t sfcOnlyFeatureExists : 1;  // The feature exists, which only support sfc.
             uint32_t bTemperalInputInuse : 1;   // true if replace input
             uint32_t veboxRGBOutputWithoutLumaKey : 1;
-            uint32_t bInternalInputInuse : 1;   // true if replace input with Internal Input
         };
         uint32_t value;
     };
diff --git a/media_softlet/agnostic/common/vp/hal/platform_interface/vp_platform_interface.cpp b/media_softlet/agnostic/common/vp/hal/platform_interface/vp_platform_interface.cpp
index e7be1391..665b6006 100644
--- a/media_softlet/agnostic/common/vp/hal/platform_interface/vp_platform_interface.cpp
+++ b/media_softlet/agnostic/common/vp/hal/platform_interface/vp_platform_interface.cpp
@@ -32,14 +32,17 @@ using namespace vp;
 extern const Kdll_RuleEntry g_KdllRuleTable_Next[];
 const std::string VpRenderKernel::s_kernelNameNonAdvKernels = "vpFcKernels";
 
-VpPlatformInterface::VpPlatformInterface(PMOS_INTERFACE pOsInterface)
+VpPlatformInterface::VpPlatformInterface(PMOS_INTERFACE pOsInterface, bool clearViewMode)
 {
     m_pOsInterface = pOsInterface;
     if (m_pOsInterface)
     {
         m_userSettingPtr = m_pOsInterface->pfnGetUserSettingInstance(m_pOsInterface);
     }
-    VpUserSetting::InitVpUserSetting(m_userSettingPtr);
+    if (!clearViewMode)
+    {
+        VpUserSetting::InitVpUserSetting(m_userSettingPtr);
+    }
 }
 
 MOS_STATUS VpRenderKernel::InitVPKernel(
diff --git a/media_softlet/agnostic/common/vp/hal/platform_interface/vp_platform_interface.h b/media_softlet/agnostic/common/vp/hal/platform_interface/vp_platform_interface.h
index 49a2f244..3197afbc 100644
--- a/media_softlet/agnostic/common/vp/hal/platform_interface/vp_platform_interface.h
+++ b/media_softlet/agnostic/common/vp/hal/platform_interface/vp_platform_interface.h
@@ -140,7 +140,7 @@ class VpPlatformInterface
 {
 public:
 
-    VpPlatformInterface(PMOS_INTERFACE pOsInterface);
+    VpPlatformInterface(PMOS_INTERFACE pOsInterface, bool clearViewMode = false);
 
     virtual ~VpPlatformInterface();
 
diff --git a/media_softlet/agnostic/common/vp/hal/utils/hal_ddi_share/vp_user_setting.cpp b/media_softlet/agnostic/common/vp/hal/utils/hal_ddi_share/vp_user_setting.cpp
index c7b7de05..493dfaa8 100644
--- a/media_softlet/agnostic/common/vp/hal/utils/hal_ddi_share/vp_user_setting.cpp
+++ b/media_softlet/agnostic/common/vp/hal/utils/hal_ddi_share/vp_user_setting.cpp
@@ -108,6 +108,13 @@ MOS_STATUS VpUserSetting::InitVpUserSetting(MediaUserSettingSharedPtr userSettin
         0,
         true);
 
+    DeclareUserSettingKey(
+        userSettingPtr,
+        __MEDIA_USER_FEATURE_VALUE_FORCE_ENABLE_VEBOX_OUTPUT_SURF,
+        MediaUserSetting::Group::Sequence,
+        0,
+        true);
+
     DeclareUserSettingKey(
         userSettingPtr,
         __VPHAL_HDR_LUT_MODE,
@@ -150,6 +157,13 @@ MOS_STATUS VpUserSetting::InitVpUserSetting(MediaUserSettingSharedPtr userSettin
         0,
         true);
 
+    DeclareUserSettingKey(  // VP Render Target Cache Usage
+        userSettingPtr,
+        __VPHAL_RT_Cache_Setting,
+        MediaUserSetting::Group::Sequence,
+        0,
+        true);
+
     DeclareUserSettingKey(  // VP Primary Input Compression Mode
         userSettingPtr,
         __VPHAL_PRIMARY_MMC_COMPRESSMODE,
diff --git a/media_softlet/agnostic/common/vp/hal/utils/vp_user_feature_control.cpp b/media_softlet/agnostic/common/vp/hal/utils/vp_user_feature_control.cpp
index 4674eda2..94828cf9 100644
--- a/media_softlet/agnostic/common/vp/hal/utils/vp_user_feature_control.cpp
+++ b/media_softlet/agnostic/common/vp/hal/utils/vp_user_feature_control.cpp
@@ -113,6 +113,24 @@ VpUserFeatureControl::VpUserFeatureControl(MOS_INTERFACE &osInterface, VpPlatfor
     }
     VP_PUBLIC_NORMALMESSAGE("disableDn %d", m_ctrlValDefault.disableDn);
 
+   // Force enable vebox ouptut surface.
+    bool forceEnableVeboxOutputSurf = false;
+    status = ReadUserSetting(
+        m_userSettingPtr,
+        forceEnableVeboxOutputSurf,
+        __MEDIA_USER_FEATURE_VALUE_FORCE_ENABLE_VEBOX_OUTPUT_SURF,
+        MediaUserSetting::Group::Sequence);
+    if (MOS_SUCCEEDED(status))
+    {
+        m_ctrlValDefault.ForceEnableVeboxOutputSurf = forceEnableVeboxOutputSurf;
+    }
+    else
+    {
+        // Default value
+        m_ctrlValDefault.ForceEnableVeboxOutputSurf = false;
+    }
+    VP_PUBLIC_NORMALMESSAGE("ForceEnableVeboxOutputSurf %d", m_ctrlValDefault.ForceEnableVeboxOutputSurf);
+
     // __MEDIA_USER_FEATURE_VALUE_CSC_COEFF_PATCH_MODE_DISABLE
     bool cscCoeffPatchModeDisabled = false;
     status = ReadUserSetting(
diff --git a/media_softlet/agnostic/common/vp/hal/utils/vp_user_feature_control.h b/media_softlet/agnostic/common/vp/hal/utils/vp_user_feature_control.h
index c9c9fe54..18d8d7cb 100644
--- a/media_softlet/agnostic/common/vp/hal/utils/vp_user_feature_control.h
+++ b/media_softlet/agnostic/common/vp/hal/utils/vp_user_feature_control.h
@@ -50,6 +50,7 @@ public:
         bool eufusionBypassWaEnabled        = false;
         bool disableDn                      = false;
         bool cscCosffPatchModeDisabled      = false;
+        bool ForceEnableVeboxOutputSurf     = false;
 
 #if (_DEBUG || _RELEASE_INTERNAL)
         bool forceDecompressedOutput        = false;
@@ -63,6 +64,7 @@ public:
         VPHAL_HDR_LUT_MODE globalLutMode      = VPHAL_HDR_LUT_MODE_NONE;  //!< Global LUT mode control for debugging purpose
         bool               gpuGenerate3DLUT   = false;                        //!< Flag for per frame GPU generation of 3DLUT
         bool               disableAutoMode    = false;
+        bool               clearVideoViewMode = false;
         uint32_t           splitFramePortions = 1;
     };
 
@@ -91,6 +93,11 @@ public:
 
     virtual MOS_STATUS Update(PVP_PIPELINE_PARAMS params);
 
+    bool IsVeboxOutputSurfEnabled()
+    {
+        return m_ctrlVal.ForceEnableVeboxOutputSurf;
+    }
+
     bool IsVeboxOutputDisabled()
     {
         return m_ctrlVal.disableVeboxOutput;
@@ -146,6 +153,17 @@ public:
         return m_ctrlVal.disableAutoMode;
     }
 
+    bool IsClearVideoViewMode()
+    {
+        return m_ctrlVal.clearVideoViewMode;
+    }
+
+    MOS_STATUS SetClearVideoViewMode(bool mode)
+    {
+        m_ctrlVal.clearVideoViewMode = mode;
+        return MOS_STATUS_SUCCESS;
+    }
+
     uint32_t GetSplitFramePortions()
     {
         return m_ctrlVal.splitFramePortions;
diff --git a/media_softlet/agnostic/common/vp/hal/utils/vp_utils.h b/media_softlet/agnostic/common/vp/hal/utils/vp_utils.h
index 43dcecb8..d4d1764b 100644
--- a/media_softlet/agnostic/common/vp/hal/utils/vp_utils.h
+++ b/media_softlet/agnostic/common/vp/hal/utils/vp_utils.h
@@ -275,6 +275,7 @@ protected:
 #define __MEDIA_USER_FEATURE_VALUE_DISABLE_DN                           "Disable Dn"
 #define __MEDIA_USER_FEATURE_VALUE_DISABLE_PACKET_REUSE                 "Disable PacketReuse"
 #define __MEDIA_USER_FEATURE_VALUE_ENABLE_PACKET_REUSE_TEAMS_ALWAYS     "Enable PacketReuse Teams mode Always"
+#define __MEDIA_USER_FEATURE_VALUE_FORCE_ENABLE_VEBOX_OUTPUT_SURF       "Force Enable Vebox Output Surf"
 
 #define __VPHAL_HDR_LUT_MODE                                            "HDR Lut Mode"
 #define __VPHAL_HDR_GPU_GENERTATE_3DLUT                                 "HDR GPU generate 3DLUT"
@@ -283,6 +284,7 @@ protected:
 #define __MEDIA_USER_FEATURE_VALUE_VPP_APOGEIOS_ENABLE                  "VP Apogeios Enabled"
 #define __VPHAL_PRIMARY_MMC_COMPRESSMODE                                "VP Primary Surface Compress Mode"
 #define __VPHAL_RT_MMC_COMPRESSMODE                                     "VP RT Compress Mode"
+#define __VPHAL_RT_Cache_Setting                                        "VP RT Cache Setting"
 
 #if (_DEBUG || _RELEASE_INTERNAL)
 #define __VPHAL_ENABLE_COMPUTE_CONTEXT                                  "VP Enable Compute Context"
diff --git a/media_softlet/linux/Xe_M_plus/ddi/media_sku_wa_mtl.cpp b/media_softlet/linux/Xe_M_plus/ddi/media_sku_wa_mtl.cpp
index 3b588232..ab4feae2 100644
--- a/media_softlet/linux/Xe_M_plus/ddi/media_sku_wa_mtl.cpp
+++ b/media_softlet/linux/Xe_M_plus/ddi/media_sku_wa_mtl.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2022, Intel Corporation
+* Copyright (c) 2022-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -150,7 +150,7 @@ static bool InitMtlMediaSkuExt(struct GfxDeviceInfo *devInfo,
         MEDIA_WR_SKU(skuTable, FtrEncodeAV1Vdenc, 1);
         MEDIA_WR_SKU(skuTable, FtrEncodeAV1Vdenc10bit420, 1);
     }
-
+    MEDIA_WR_SKU(skuTable, FtrEnableProtectedHuc, drvInfo->hasProtectedHuc);
     MEDIA_WR_SKU(skuTable, FtrEnableMediaKernels, drvInfo->hasHuc);
     MEDIA_WR_SKU(skuTable, FtrVERing, drvInfo->hasVebox);
     MEDIA_WR_SKU(skuTable, FtrPPGTT, drvInfo->hasPpgtt);
diff --git a/media_softlet/linux/common/ddi/media_libva_caps_next.cpp b/media_softlet/linux/common/ddi/media_libva_caps_next.cpp
index 2c1b09ce..2c1af2bb 100644
--- a/media_softlet/linux/common/ddi/media_libva_caps_next.cpp
+++ b/media_softlet/linux/common/ddi/media_libva_caps_next.cpp
@@ -558,11 +558,19 @@ VAStatus MediaLibvaCapsNext::QueryDisplayAttributes(
 
     DDI_CHK_NULL(attribList, "Null attribList", VA_STATUS_ERROR_INVALID_PARAMETER);
     DDI_CHK_NULL(attributesNum, "Null attribs", VA_STATUS_ERROR_INVALID_PARAMETER);
+    VADisplayAttribute * attrib = attribList;
     *attributesNum = 0;
 
-    attribList->type = VADisplayAttribCopy;
+    attrib->type = VADisplayAttribCopy;
     (*attributesNum) ++;
 
+#if VA_CHECK_VERSION(1, 15, 0)
+    attrib ++;
+
+    attrib->type = VADisplayPCIID;
+    (*attributesNum) ++;
+#endif
+
     return GetDisplayAttributes(attribList, *attributesNum);
 }
 
@@ -581,6 +589,12 @@ VAStatus MediaLibvaCapsNext::GetDisplayAttributes(
                 attribList->min_value = attribList->value = attribList->max_value = 0;
                 attribList->flags = VA_DISPLAY_ATTRIB_GETTABLE;
                 break;
+#if VA_CHECK_VERSION(1, 15, 0)
+            case VADisplayPCIID:
+                attribList->min_value = attribList->value = attribList->max_value = (m_mediaCtx->iDeviceId & 0xffff) | 0x80860000;
+                attribList->flags = VA_DISPLAY_ATTRIB_GETTABLE;
+                break;
+#endif
             default:
                 attribList->min_value = VA_ATTRIB_NOT_SUPPORTED;
                 attribList->max_value = VA_ATTRIB_NOT_SUPPORTED;
diff --git a/media_softlet/linux/common/media_interfaces/media_interfaces_next.cpp b/media_softlet/linux/common/media_interfaces/media_interfaces_next.cpp
index 955d21b9..26ed4d04 100644
--- a/media_softlet/linux/common/media_interfaces/media_interfaces_next.cpp
+++ b/media_softlet/linux/common/media_interfaces/media_interfaces_next.cpp
@@ -58,7 +58,8 @@ typedef MediaFactory<uint32_t, MmdDeviceNext> MmdFactoryNext;
 VpBase *VphalDevice::CreateFactoryNext(
     PMOS_INTERFACE     osInterface,
     MOS_CONTEXT_HANDLE osDriverContext,
-    MOS_STATUS         *eStatus)
+    MOS_STATUS         *eStatus,
+    bool               clearViewMode)
 {
     VpBase                *vpBase            = nullptr;
     VphalDevice           *vphalDevice       = nullptr;
diff --git a/media_softlet/linux/common/os/hwinfo_linux.cpp b/media_softlet/linux/common/os/hwinfo_linux.cpp
index ade93b60..dbf09b6b 100644
--- a/media_softlet/linux/common/os/hwinfo_linux.cpp
+++ b/media_softlet/linux/common/os/hwinfo_linux.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2017-2021, Intel Corporation
+* Copyright (c) 2017-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -441,6 +441,10 @@ MOS_STATUS HWInfoGetLinuxDrvInfo(int fd, struct LinuxDriverInfo *drvInfo)
     if (MediaGetParam(fd, LOCAL_I915_PARAM_HAS_HUC, &retValue))
     {
         drvInfo->hasHuc = !!retValue;
+        if (retValue == 1)
+        {
+            drvInfo->hasProtectedHuc = 1;
+        }
     }
 
     drvInfo->devId = 0;
diff --git a/media_softlet/linux/common/os/linux_system_info.h b/media_softlet/linux/common/os/linux_system_info.h
index 910c8121..dd6741e6 100644
--- a/media_softlet/linux/common/os/linux_system_info.h
+++ b/media_softlet/linux/common/os/linux_system_info.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2017, Intel Corporation
+* Copyright (c) 2017-2023, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -54,6 +54,7 @@ struct LinuxDriverInfo
     uint32_t hasVebox : 1;
     uint32_t hasBltRing : 1;
     uint32_t hasHuc   : 1;
+    uint32_t hasProtectedHuc : 1;
     uint32_t hasPpgtt : 1;
     uint32_t hasPreemption : 1;
     uint32_t isServer : 1;
diff --git a/media_softlet/linux/common/vp/ddi/ddi_vp_functions.cpp b/media_softlet/linux/common/vp/ddi/ddi_vp_functions.cpp
index dfc59809..2f44570f 100644
--- a/media_softlet/linux/common/vp/ddi/ddi_vp_functions.cpp
+++ b/media_softlet/linux/common/vp/ddi/ddi_vp_functions.cpp
@@ -1582,6 +1582,12 @@ void DdiVpFunctions::VpFeatureReport(PVP_CONFIG config, PDDI_VP_CONTEXT vpCtx)
         config->dwRTCompressMode,
         MediaUserSetting::Group::Sequence);
 #endif
+    //VP RT Cache Usage
+    ReportUserSetting(
+        userSettingPtr,
+        __VPHAL_RT_Cache_Setting,
+        config->dwRTCacheSetting,
+        MediaUserSetting::Group::Sequence);
 
 #if (_DEBUG || _RELEASE_INTERNAL)
     ReportUserSettingForDebug(
diff --git a/media_softlet/media_interface/media_interfaces_mtl/media_interfaces_mtl.cpp b/media_softlet/media_interface/media_interfaces_mtl/media_interfaces_mtl.cpp
index c5e6fe63..8c1ff7eb 100644
--- a/media_softlet/media_interface/media_interfaces_mtl/media_interfaces_mtl.cpp
+++ b/media_softlet/media_interface/media_interfaces_mtl/media_interfaces_mtl.cpp
@@ -71,7 +71,8 @@ static bool mtlRegisteredVphal =
 MOS_STATUS VphalInterfacesXe_Lpm_Plus::Initialize(
     PMOS_INTERFACE osInterface,
     bool           bInitVphalState,
-    MOS_STATUS *   eStatus)
+    MOS_STATUS *   eStatus,
+    bool           clearViewMode)
 {
     vp::VpPlatformInterface *vpPlatformInterface = MOS_New(vp::VpPlatformInterfacesXe_Lpm_Plus, osInterface);
     if (nullptr == vpPlatformInterface)
diff --git a/media_softlet/media_interface/media_interfaces_mtl/media_interfaces_mtl.h b/media_softlet/media_interface/media_interfaces_mtl/media_interfaces_mtl.h
index 826c28a1..0334988a 100644
--- a/media_softlet/media_interface/media_interfaces_mtl/media_interfaces_mtl.h
+++ b/media_softlet/media_interface/media_interfaces_mtl/media_interfaces_mtl.h
@@ -189,7 +189,8 @@ public:
     MOS_STATUS Initialize(
         PMOS_INTERFACE  osInterface,
         bool            bInitVphalState,
-        MOS_STATUS      *eStatus);
+        MOS_STATUS      *eStatus,
+        bool            clearViewMode = false);
 
     MOS_STATUS CreateVpPlatformInterface(
         PMOS_INTERFACE           osInterface,

More details

Full run details

Historical runs