CHROMIUM: Reset tree to upstream/intel-media-24.2.5

BUG=b:356521467
TEST=emerge-$BOARD libva-intel-media-driver

Change-Id: I073f9ca372a24fb2928b56b2a59d237cf3f82d7b
Signed-off-by: Nitin Hegde <nitin.hegde@intel.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/libva-intel-media-driver/+/5736958
Reviewed-by: Jao-ke Chin-Lee <jchinlee@chromium.org>
Reviewed-by: Jao-ke Chin-Lee <jchinlee@google.com>
Tested-by: Natarajan Balamurugan <balamurugan.natarajan@intel.corp-partner.google.com>
diff --git a/.github/workflows/ubuntu.yml b/.github/workflows/ubuntu.yml
index b5bde9e..bfd482a 100644
--- a/.github/workflows/ubuntu.yml
+++ b/.github/workflows/ubuntu.yml
@@ -16,16 +16,16 @@
       ASM: /usr/bin/clang-14
     steps:
     - name: checkout media-driver
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         path: media
     - name: checkout libva
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/libva
         path: libva
     - name: checkout gmmlib
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/gmmlib
         path: gmmlib
@@ -89,16 +89,16 @@
       ASM: /usr/bin/gcc-11
     steps:
     - name: checkout media-driver
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         path: media
     - name: checkout libva
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/libva
         path: libva
     - name: checkout gmmlib
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/gmmlib
         path: gmmlib
@@ -158,16 +158,16 @@
       ASM: /usr/bin/gcc-10
     steps:
     - name: checkout media-driver
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         path: media
     - name: checkout libva
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/libva
         path: libva
     - name: checkout gmmlib
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/gmmlib
         path: gmmlib
@@ -221,16 +221,16 @@
       ASM: /usr/bin/gcc-10
     steps:
     - name: checkout media-driver
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         path: media
     - name: checkout libva
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/libva
         path: libva
     - name: checkout gmmlib
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/gmmlib
         path: gmmlib
@@ -286,16 +286,16 @@
       ASM: /usr/bin/gcc-10
     steps:
     - name: checkout media-driver
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         path: media
     - name: checkout libva
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/libva
         path: libva
     - name: checkout gmmlib
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/gmmlib
         path: gmmlib
@@ -351,16 +351,16 @@
       ASM: /usr/bin/gcc-10
     steps:
     - name: checkout media-driver
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         path: media
     - name: checkout libva
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/libva
         path: libva
     - name: checkout gmmlib
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/gmmlib
         path: gmmlib
@@ -416,16 +416,16 @@
       ASM: /usr/bin/gcc-10
     steps:
     - name: checkout media-driver
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         path: media
     - name: checkout libva
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/libva
         path: libva
     - name: checkout gmmlib
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/gmmlib
         path: gmmlib
@@ -481,16 +481,16 @@
       ASM: /usr/bin/gcc-10
     steps:
     - name: checkout media-driver
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         path: media
     - name: checkout libva
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/libva
         path: libva
     - name: checkout gmmlib
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/gmmlib
         path: gmmlib
@@ -546,16 +546,16 @@
       ASM: /usr/bin/gcc-10
     steps:
     - name: checkout media-driver
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         path: media
     - name: checkout libva
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/libva
         path: libva
     - name: checkout gmmlib
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/gmmlib
         path: gmmlib
@@ -611,16 +611,16 @@
       ASM: /usr/bin/gcc-10
     steps:
     - name: checkout media-driver
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         path: media
     - name: checkout libva
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/libva
         path: libva
     - name: checkout gmmlib
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/gmmlib
         path: gmmlib
@@ -676,16 +676,16 @@
       ASM: /usr/bin/gcc-10
     steps:
     - name: checkout media-driver
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         path: media
     - name: checkout libva
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/libva
         path: libva
     - name: checkout gmmlib
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/gmmlib
         path: gmmlib
@@ -741,16 +741,16 @@
       ASM: /usr/bin/gcc-10
     steps:
     - name: checkout media-driver
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         path: media
     - name: checkout libva
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/libva
         path: libva
     - name: checkout gmmlib
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/gmmlib
         path: gmmlib
@@ -806,16 +806,16 @@
       ASM: /usr/bin/gcc-10
     steps:
     - name: checkout media-driver
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         path: media
     - name: checkout libva
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/libva
         path: libva
     - name: checkout gmmlib
-      uses: actions/checkout@v2
+      uses: actions/checkout@v4
       with:
         repository: intel/gmmlib
         path: gmmlib
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 816cc4b..da1ff50 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -20,7 +20,7 @@
 
 cmake_minimum_required(VERSION 3.5)
 project(IntelMediaDriver)
-set(MEDIA_VERSION "24.1.5${MEDIA_VERSION_EXTRA}" CACHE STRING "" FORCE)
+set(MEDIA_VERSION "24.2.5${MEDIA_VERSION_EXTRA}" CACHE STRING "" FORCE)
 
 
 
diff --git a/README.md b/README.md
index f98c884..aa5f457 100755
--- a/README.md
+++ b/README.md
@@ -82,7 +82,7 @@
 - TGLx (TGL: Tiger Lake, RKL: Rocket Lake, ADL-S/P/N: Alder Lake, RPL-S/P: Raptor Lake)
 - DG1/SG1
 - Alchemist(DG2)/ATSM
-- MTLx (MTL: Meteor Lake, ARL-S: Arrow Lake)
+- MTLx (MTL: Meteor Lake, ARL-S/H: Arrow Lake)
 
 
 ## Components and Features
diff --git a/VERSION b/VERSION
index 7778754..d1edc7c 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-24.1.5
+24.2.5
diff --git a/media_common/agnostic/common/codec/shared/codec_def_encode_av1.h b/media_common/agnostic/common/codec/shared/codec_def_encode_av1.h
index f3c30f3..388cb02 100644
--- a/media_common/agnostic/common/codec/shared/codec_def_encode_av1.h
+++ b/media_common/agnostic/common/codec/shared/codec_def_encode_av1.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2019-2023, Intel Corporation
+* Copyright (c) 2019-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -481,7 +481,19 @@
     uint32_t    InputType;
     uint32_t    TargetFrameSize;
     uint8_t     QpModulationStrength;
-    uint8_t     reserved8b[3];
+
+    /*! \brief quality information report enable flags.
+    */
+    union
+    {
+        struct
+        {
+            uint8_t enable_frame : 1;
+            uint8_t reserved     : 7;
+        } fields;
+        uint8_t value;
+    } QualityInfoSupportFlags;
+    uint8_t     reserved8b[2];
     uint32_t    Reserved10[14];
 } CODEC_AV1_ENCODE_PICTURE_PARAMS, *PCODEC_AV1_ENCODE_PICTURE_PARAMS;
 
@@ -800,4 +812,10 @@
     AV1MetaDataOffset AV1metaDataOffset  = {};       //!< [AV1] AV1 Specific metadata offset
 };
 
+enum RoundingMethod
+{
+    fixedRounding = 0,
+    adaptiveRounding,
+    lookUpTableRounding
+};
 #endif  // __CODEC_DEF_ENCODE_AV1_H__
diff --git a/media_common/agnostic/common/codec/shared/codec_def_encode_avc.h b/media_common/agnostic/common/codec/shared/codec_def_encode_avc.h
index a96db6b..69db7eb 100644
--- a/media_common/agnostic/common/codec/shared/codec_def_encode_avc.h
+++ b/media_common/agnostic/common/codec/shared/codec_def_encode_avc.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2017-2022, Intel Corporation
+* Copyright (c) 2017-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -1067,6 +1067,17 @@
         uint16_t value;
     } StatusReportEnable;
 
+    /*! \brief quality information report enable flags.
+    */
+    union
+    {
+        struct
+        {
+            uint8_t enable_frame : 1;
+            uint8_t reserved : 7;
+        } fields;
+        uint8_t value;
+    } QualityInfoSupportFlags;
 } CODEC_AVC_ENCODE_PIC_PARAMS, *PCODEC_AVC_ENCODE_PIC_PARAMS;
 
 /*! \brief Slice-level parameters of a compressed picture for AVC encoding.
diff --git a/media_common/agnostic/common/codec/shared/codec_def_encode_hevc.h b/media_common/agnostic/common/codec/shared/codec_def_encode_hevc.h
index fcf119e..8cae546 100644
--- a/media_common/agnostic/common/codec/shared/codec_def_encode_hevc.h
+++ b/media_common/agnostic/common/codec/shared/codec_def_encode_hevc.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2016-2018, Intel Corporation
+* Copyright (c) 2016-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -966,6 +966,18 @@
         } fields;
         uint16_t value;
     } StatusReportEnable;
+
+    /*! \brief quality information report enable flags.
+    */
+    union
+    {
+        struct
+        {
+            uint8_t enable_frame : 1;
+            uint8_t reserved : 7;
+        } fields;
+        uint8_t value;
+    } QualityInfoSupportFlags;
 } CODEC_HEVC_ENCODE_PICTURE_PARAMS, *PCODEC_HEVC_ENCODE_PICTURE_PARAMS;
 
 /*! \brief Slice-level parameters of a compressed picture for HEVC encoding.
diff --git a/media_common/agnostic/common/hw/mhw_blt.h b/media_common/agnostic/common/hw/mhw_blt.h
index 5d871b0..0932f50 100644
--- a/media_common/agnostic/common/hw/mhw_blt.h
+++ b/media_common/agnostic/common/hw/mhw_blt.h
@@ -43,6 +43,8 @@
     uint32_t        dwDstBottom;
     uint32_t        dwDstLeft;
     uint32_t        dwDstRight;
+    uint32_t        dwPlaneIndex;
+    uint32_t        dwPlaneNum;
     PMOS_RESOURCE   pSrcOsResource;
     PMOS_RESOURCE   pDstOsResource;
 }MHW_FAST_COPY_BLT_PARAM, *PMHW_FAST_COPY_BLT_PARAM;
diff --git a/media_common/agnostic/common/hw/mhw_render.h b/media_common/agnostic/common/hw/mhw_render.h
index 91ff06b..f9d491c 100644
--- a/media_common/agnostic/common/hw/mhw_render.h
+++ b/media_common/agnostic/common/hw/mhw_render.h
@@ -41,6 +41,8 @@
 #define MHW_RENDER_ENGINE_INTERFACE_DESCRIPTOR_ENTRIES_MAX  64
 #define MHW_RENDER_ENGINE_EU_INDEX_MAX                      12
 #define MHW_RENDER_ENGINE_SIZE_REGISTERS_PER_THREAD         0x1800
+#define MHW_RENDER_ENGINE_NUMBER_OF_THREAD_UNIT             32
+#define MHW_RENDER_ENGINE_MAX_NUMBER_OF_THREAD              (1024 / MHW_RENDER_ENGINE_NUMBER_OF_THREAD_UNIT)
 
 #define MHW_MAX_DEPENDENCY_COUNT                    8
 
@@ -97,6 +99,14 @@
     MHW_WALKER_MODE_OCT     = 8     // may apply in future Gen media architectures
 } MHW_WALKER_MODE;
 
+typedef enum _MHW_EMIT_LOCAL_MODE
+{
+    MHW_EMIT_LOCAL_NONE = 0,
+    MHW_EMIT_LOCAL_X    = 1,
+    MHW_EMIT_LOCAL_XY   = 3,
+    MHW_EMIT_LOCAL_XYZ  = 7
+} MHW_EMIT_LOCAL_MODE;
+
 //!
 //! \brief  Structure to capture HW capabilities
 //!
@@ -290,6 +300,14 @@
     uint32_t                   IndirectDataStartAddress;
     uint32_t                   BindingTableID;
     uint32_t                   ForcePreferredSLMZero;
+
+    bool                       isEmitInlineParameter;
+    uint32_t                   inlineDataLength;
+    uint8_t*                   inlineData;
+
+    bool                       isGenerateLocalID;
+    MHW_EMIT_LOCAL_MODE        emitLocal;
+    
 } MHW_GPGPU_WALKER_PARAMS, *PMHW_GPGPU_WALKER_PARAMS;
 
 typedef struct _MHW_MEDIA_OBJECT_PARAMS
diff --git a/media_common/agnostic/common/hw/mhw_sfc.h b/media_common/agnostic/common/hw/mhw_sfc.h
index 8acb8c4..aa0ed38 100644
--- a/media_common/agnostic/common/hw/mhw_sfc.h
+++ b/media_common/agnostic/common/hw/mhw_sfc.h
@@ -282,6 +282,7 @@
     uint16_t                        wOutputSurfaceUYOffset;                     // Output Frame offset (page internal U offset for Y axis)
     uint16_t                        wOutputSurfaceVXOffset;                     // Output Frame offset (page internal V offset for X axis)
     uint16_t                        wOutputSurfaceVYOffset;                     // Output Frame offset (page internal V offset for Y axis)
+    bool                            isDemosaicEnabled         = false;          //!< Enable Demosaic
 
 } MHW_SFC_STATE_PARAMS, *PMHW_SFC_STATE_PARAMS;
 
diff --git a/media_common/agnostic/common/hw/mhw_vebox.h b/media_common/agnostic/common/hw/mhw_vebox.h
index c816131..b481ec8 100644
--- a/media_common/agnostic/common/hw/mhw_vebox.h
+++ b/media_common/agnostic/common/hw/mhw_vebox.h
@@ -208,6 +208,18 @@
     uint32_t                                                : 25; // Reserved
 } MHW_VEBOX_3D_LUT, *PMHW_VEBOX_3D_LUT;
 
+typedef struct _MHW_VEBOX_FP16_INPUT
+{
+    uint32_t GamutExpansionPosition                         : 1;
+    uint32_t EotfPrecision                                  : 1;
+    uint32_t BypassCcm                                      : 1;
+    uint32_t BypassOetf                                     : 1;
+    uint32_t VeboxFp16InputEnable                           : 1;
+    uint32_t RgbSwapForFp16Input                            : 1;
+    uint32_t HdrGainFactor                                  : 8;
+    uint32_t                                                : 18;  // Reserved
+} MHW_VEBOX_FP16_INPUT, *PMHW_VEBOX_FP16_INPUT;
+
 //!
 //! \brief  Structure to handle VEBOX_STATE_CMD Command
 //!
@@ -216,6 +228,7 @@
     MHW_VEBOX_MODE                      VeboxMode;
     MHW_VEBOX_CHROMA_SAMPLING           ChromaSampling;
     MHW_VEBOX_3D_LUT                    LUT3D;
+    MHW_VEBOX_FP16_INPUT                FP16Input;
     bool                                bUseVeboxHeapKernelResource;
     PMOS_RESOURCE                       pLaceLookUpTables;
     PMOS_RESOURCE                       pVeboxParamSurf;
@@ -225,6 +238,7 @@
     MHW_MEMORY_OBJECT_CONTROL_PARAMS    LaceLookUpTablesSurfCtrl;
     MHW_MEMORY_OBJECT_CONTROL_PARAMS    Vebox3DLookUpTablesSurfCtrl;
     bool                                bNoUseVeboxHeap;
+    bool                                isTlbPrefetchDisable;
 } MHW_VEBOX_STATE_CMD_PARAMS, *PMHW_VEBOX_STATE_CMD_PARAMS;
 
 //!
@@ -626,6 +640,17 @@
 } MHW_1DLUT_PARAMS, *PMHW_1DLUT_PARAMS;
 
 //!
+//! Structure MHW_3DLUT_PARAMS
+//! \details No pre-si version for MHW_VEBOX_IECP_PARAMS, just leave it now and handle it later
+//!
+typedef struct _MHW_FP16_PARAMS
+{
+    uint32_t                isActive       = false;              //!< Active or not
+    uint32_t                OETFLutY[256]  = {};
+    uint32_t                OETFLutX[256]  = {};
+} MHW_FP16_PARAMS, *PMHW_FP16_PARAMS;
+
+//!
 //! \brief  VEBOX IECP parameters
 //!
 typedef struct _MHW_VEBOX_IECP_PARAMS
@@ -650,6 +675,7 @@
 
     MHW_3DLUT_PARAMS                s3DLutParams;
     MHW_1DLUT_PARAMS                s1DLutParams;
+    MHW_FP16_PARAMS                 fp16Params;
 
     // Front End CSC params
     bool                            bFeCSCEnable;                               // Enable Front End CSC transform
diff --git a/media_common/agnostic/common/hw/vdbox/mhw_vdbox.h b/media_common/agnostic/common/hw/vdbox/mhw_vdbox.h
index 6c63894..6d2ef30 100644
--- a/media_common/agnostic/common/hw/vdbox/mhw_vdbox.h
+++ b/media_common/agnostic/common/hw/vdbox/mhw_vdbox.h
@@ -294,6 +294,8 @@
     MOS_MEMCOMP_STATE           mmcState;
     uint8_t                     mmcSkipMask;
     uint32_t                    dwCompressionFormat;
+    uint8_t                     refsMmcEnable;
+    uint8_t                     refsMmcType;
 } MHW_VDBOX_SURFACE_PARAMS, *PMHW_VDBOX_SURFACE_PARAMS;
 
 struct MHW_VDBOX_PIPE_BUF_ADDR_PARAMS
diff --git a/media_common/agnostic/common/os/mos_os.h b/media_common/agnostic/common/os/mos_os.h
index 1d6b18c..71e518e 100644
--- a/media_common/agnostic/common/os/mos_os.h
+++ b/media_common/agnostic/common/os/mos_os.h
@@ -251,6 +251,7 @@
 typedef int32_t MOS_SUBMISSION_TYPE;
 
 #define EXTRA_PADDING_NEEDED                            4096
+#define MEDIA_CMF_UNCOMPRESSED_WRITE                    0xC
 
 //!
 //! \brief Structure to command buffer
@@ -483,6 +484,18 @@
 class MosCpInterface;
 class MosDecompression;
 
+//!
+//! \brief Structure to Unified  InDirectState Dump Info
+//!
+struct INDIRECT_STATE_INFO
+{
+    uint32_t        stateSize              = 0;        //size of indirectstate
+    uint32_t        *indirectState         = nullptr;  //indirectstate address
+    uint32_t        *gfxAddressBottom      = nullptr;  //indirect gfx address bottom
+    uint32_t        *gfxAddressTop         = nullptr;  //indirect gfx address top
+    const char      *stateName             = "";
+};
+
 struct MosStreamState
 {
     OsDeviceContext     *osDeviceContext        = nullptr;
@@ -514,6 +527,8 @@
 
     bool mediaReset                             = false;    //!< Flag to indicate media reset is enabled
 
+    bool forceMediaCompressedWrite              = false;    //!< Flag to force media compressed write
+
     bool simIsActive                            = false;    //!< Flag to indicate if Simulation is enabled
     MOS_NULL_RENDERING_FLAGS nullHwAccelerationEnable = {}; //!< To indicate which components to enable Null HW support
 
@@ -534,6 +549,7 @@
     bool  dumpCommandBufferToFile               = false;    //!< Indicates that the command buffer should be dumped to a file
     bool  dumpCommandBufferAsMessages           = false;    //!< Indicates that the command buffer should be dumped via MOS normal messages
     char  sDirName[MOS_MAX_HLT_FILENAME_LEN]    = {0};      //!< Dump Directory name - maximum 260 bytes length
+    std::vector<INDIRECT_STATE_INFO> indirectStateInfo                     = {};
 #endif // MOS_COMMAND_BUFFER_DUMP_SUPPORTED
 
 #if _DEBUG || _RELEASE_INTERNAL
@@ -684,6 +700,8 @@
 
     bool                            umdMediaResetEnable;
 
+    bool                            forceMediaCompressedWrite;
+
 #if MOS_MEDIASOLO_SUPPORTED
     // MediaSolo related
     int32_t                         bSoloInUse;                                   //!< Flag to indicate if MediaSolo is enabled
@@ -928,6 +946,14 @@
         PMOS_INTERFACE              pOsInterface,
         PMOS_COMMAND_BUFFER         pCmdBuffer);
 
+    void (* pfnAddIndirectState) (
+        PMOS_INTERFACE      pOsInterface,
+        uint32_t            indirectStateSize,
+        uint32_t            *pIndirectState,
+        uint32_t            *gfxAddressBottom,
+        uint32_t            *gfxAddressTop,
+        const char          *stateName);
+
     #define pfnFreeResource(pOsInterface, pResource) \
        pfnFreeResource(pOsInterface, __FUNCTION__, __FILE__, __LINE__, pResource)
 
diff --git a/media_common/agnostic/common/os/mos_util_user_feature_keys.h b/media_common/agnostic/common/os/mos_util_user_feature_keys.h
index 633ada2..601eb9e 100644
--- a/media_common/agnostic/common/os/mos_util_user_feature_keys.h
+++ b/media_common/agnostic/common/os/mos_util_user_feature_keys.h
@@ -77,6 +77,7 @@
 
 #define __MEDIA_USER_FEATURE_VALUE_MEDIA_RESET_ENABLE                   "Media Reset"
 #define __MEDIA_USER_FEATURE_VALUE_FORCE_RESET_THRESHOLD                "Force media reset threshold"
+#define __MEDIA_USER_FEATURE_VALUE_FORCE_MEDIA_COMPRESSED_WRITE         "Force Media Compressed Write"
 
 //!
 //! \brief Keys for media
diff --git a/media_common/agnostic/common/renderhal/renderhal.h b/media_common/agnostic/common/renderhal/renderhal.h
index 790de5c..8b3d560 100644
--- a/media_common/agnostic/common/renderhal/renderhal.h
+++ b/media_common/agnostic/common/renderhal/renderhal.h
@@ -1178,6 +1178,7 @@
     MHW_STATE_BASE_ADDR_PARAMS   StateBaseAddressParams;
     MHW_SIP_STATE_PARAMS         SipStateParams;
     MHW_WALKER_MODE              MediaWalkerMode;                               // Media object walker mode from Regkey: repel, dual mode, quad mode
+    uint32_t                     euThreadSchedulingMode;
 
     RENDERHAL_SURFACE_STATE_TYPE SurfaceTypeDefault;                            // Surface State type default
     RENDERHAL_SURFACE_STATE_TYPE SurfaceTypeAdvanced;                           // Surface State type advanced
diff --git a/media_common/agnostic/common/vp/hal/vp_common.h b/media_common/agnostic/common/vp/hal/vp_common.h
index 3bda5f9..3637de0 100644
--- a/media_common/agnostic/common/vp/hal/vp_common.h
+++ b/media_common/agnostic/common/vp/hal/vp_common.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2022, Intel Corporation
+* Copyright (c) 2022-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -188,6 +188,8 @@
 
     // 3DLUT parameters
     PVPHAL_3DLUT_PARAMS p3DLutParams = nullptr;  //!< 3DLut Mapping Params
+
+    PVPHAL_GAMUT_PARAMS pGamutParams       = nullptr;  //!< Gamut Compression & Expansion
 };
 
 //!
diff --git a/media_common/agnostic/common/vp/hal/vp_common_defs.h b/media_common/agnostic/common/vp/hal/vp_common_defs.h
index 55e772d..8319583 100644
--- a/media_common/agnostic/common/vp/hal/vp_common_defs.h
+++ b/media_common/agnostic/common/vp/hal/vp_common_defs.h
@@ -184,6 +184,8 @@
     // mediacopy-render copy
     kernelRenderCopy,
 
+    kernelFcDScale444,
+
     baseKernelMaxNumID
 };
 
@@ -191,6 +193,7 @@
 {
     vpKernelIDNextBase = 0x200,
     kernelHdr3DLutCalc = vpKernelIDNextBase,
+    kernelHdr3DLutCalcL0,
     kernelHVSCalc,
     vpKernelIDNextMax
 };
@@ -931,6 +934,14 @@
     float fNonLinearCrop;
 } VPHAL_NLAS_PARAMS, *PVPHAL_NLAS_PARAMS;
 
+typedef struct _VPHAL_VIDEO_COLOR_RGBA
+{
+    float R;
+    float G;
+    float B;
+    float A;
+} VPHAL_VIDEO_COLOR_RGBA;
+
 //!
 //! Structure VPHAL_COLORFILL_PARAMS
 //! \brief ColorFill parameters
@@ -939,6 +950,7 @@
 {
     bool         bYCbCr                 = false;
     uint32_t     Color                  = 0;
+    VPHAL_VIDEO_COLOR_RGBA Color1       = {};
     VPHAL_CSPACE CSpace                 = CSpace_None;
     bool         bDisableColorfillinSFC = false;
     bool         bOnePixelBiasinSFC     = false;
diff --git a/media_common/agnostic/common/vp/kdll/hal_kerneldll_next.h b/media_common/agnostic/common/vp/kdll/hal_kerneldll_next.h
index 8e2ab37..42d9d32 100644
--- a/media_common/agnostic/common/vp/kdll/hal_kerneldll_next.h
+++ b/media_common/agnostic/common/vp/kdll/hal_kerneldll_next.h
@@ -54,23 +54,23 @@
 
 #define DL_MAX_SEARCH_FILTER_SIZE 10  // max number of entries to describe a compositing filter
 
-#define DL_MAX_KERNELS 150         // Max component kernels to combine
+#define DL_MAX_KERNELS 256         // Max component kernels to combine
 #define DL_MAX_PATCH_DATA_SIZE 64  // Max size of a patch block
 #define DL_MAX_PATCH_BLOCKS 8      // Max number of blocks to patch per patch data
-#define DL_MAX_PATCHES 4           // Max patches to use
+#define DL_MAX_PATCHES 8           // Max patches to use
 #define DL_MAX_EXPORT_COUNT 64     // size of the symbol export table
 
 #define DL_MAX_COMBINED_KERNELS 64       // Max number of kernels in cache
 #define DL_MAX_SYMBOLS 100               // max number of import/export symbols in a combined kernels
-#define DL_MAX_KERNEL_SIZE (140 * 1024)  // max output kernel size
+#define DL_MAX_KERNEL_SIZE (160 * 1024)  // max output kernel size
 
-#define DL_CSC_MAX 6                      // 6 CSC matrices max
+#define DL_CSC_MAX 8                      // 8 CSC matrices max
 #define DL_MAX_SEARCH_NODES_PER_KERNEL 6  // max number of search nodes for a component kernel (max tree depth)
 #define DL_MAX_COMPONENT_KERNELS 25       // max number of component kernels that can be combined
 
 #define DL_DEFAULT_COMBINED_KERNELS 4                                                  // Default number of kernels in cache
 #define DL_NEW_COMBINED_KERNELS 4                                                      // The increased number of kernels in cache each time
-#define DL_CACHE_BLOCK_SIZE (140 * 1024)                                               // Kernel allocation block size
+#define DL_CACHE_BLOCK_SIZE (160 * 1024)                                               // Kernel allocation block size
 #define DL_COMBINED_KERNEL_CACHE_SIZE (DL_CACHE_BLOCK_SIZE * DL_NEW_COMBINED_KERNELS)  // Combined kernel size
 
 #define DL_PROCAMP_DISABLED -1  // procamp is disabled
diff --git a/media_common/linux/common/os/mos_util_user_feature_keys_specific.h b/media_common/linux/common/os/mos_util_user_feature_keys_specific.h
index 947bdfe..353c0f1 100644
--- a/media_common/linux/common/os/mos_util_user_feature_keys_specific.h
+++ b/media_common/linux/common/os/mos_util_user_feature_keys_specific.h
@@ -41,5 +41,6 @@
 #define __MEDIA_USER_FEATURE_VALUE_ENABLE_SOFTPIN       "Enable Softpin"
 #define __MEDIA_USER_FEATURE_VALUE_DISABLE_KMD_WATCHDOG "Disable KMD Watchdog"
 #define __MEDIA_USER_FEATURE_VALUE_ENABLE_VM_BIND       "Enable VM Bind"
+#define __MEDIA_USER_FEATURE_VALUE_ENABLE_MEDIA_CCS     "Enable Media CCS"
 
 #endif // __MOS_UTIL_USER_FEATURE_KEYS_SPECIFIC_H__
diff --git a/media_driver/agnostic/Xe_M/Xe_HPM/codec/hal/codechal_vdenc_avc_xe_hpm.cpp b/media_driver/agnostic/Xe_M/Xe_HPM/codec/hal/codechal_vdenc_avc_xe_hpm.cpp
index e944db6..d6b414e 100644
--- a/media_driver/agnostic/Xe_M/Xe_HPM/codec/hal/codechal_vdenc_avc_xe_hpm.cpp
+++ b/media_driver/agnostic/Xe_M/Xe_HPM/codec/hal/codechal_vdenc_avc_xe_hpm.cpp
@@ -889,6 +889,7 @@
     // Check Huc auth: if equals to 0 continue chained BB until reset, otherwise send BB end cmd.
     uint32_t compareOperation = mhw_mi_g12_X::MI_CONDITIONAL_BATCH_BUFFER_END_CMD::COMPARE_OPERATION_MADEQUALIDD;
     auto hwInterface = dynamic_cast<CodechalHwInterfaceG12 *>(m_hwInterface);
+    CODECHAL_ENCODE_CHK_NULL_RETURN(hwInterface);
     CODECHAL_ENCODE_CHK_STATUS_RETURN(hwInterface->SendCondBbEndCmd(
         &m_hucAuthBuf, 0, 0, false, true, compareOperation, &cmdBuffer));
 
diff --git a/media_driver/agnostic/Xe_M/Xe_HPM/codec/hal/codechal_vdenc_vp9_xe_hpm.cpp b/media_driver/agnostic/Xe_M/Xe_HPM/codec/hal/codechal_vdenc_vp9_xe_hpm.cpp
index be714bd..f647a75 100644
--- a/media_driver/agnostic/Xe_M/Xe_HPM/codec/hal/codechal_vdenc_vp9_xe_hpm.cpp
+++ b/media_driver/agnostic/Xe_M/Xe_HPM/codec/hal/codechal_vdenc_vp9_xe_hpm.cpp
@@ -1230,6 +1230,7 @@
     // Check Huc auth: if equals to 0 continue chained BB until reset, otherwise send BB end cmd.
     uint32_t compareOperation = mhw_mi_g12_X::MI_CONDITIONAL_BATCH_BUFFER_END_CMD::COMPARE_OPERATION_MADEQUALIDD;
     auto hwInterface = dynamic_cast<CodechalHwInterfaceG12 *>(m_hwInterface);
+    CODECHAL_ENCODE_CHK_NULL_RETURN(hwInterface);
     CODECHAL_ENCODE_CHK_STATUS_RETURN(hwInterface->SendCondBbEndCmd(
         &m_hucAuthBuf, 0, 0, false, true, compareOperation, &cmdBuffer));
 
diff --git a/media_driver/agnostic/Xe_M/Xe_XPM/vp/hal/vphal_render_composite_xe_xpm.cpp b/media_driver/agnostic/Xe_M/Xe_XPM/vp/hal/vphal_render_composite_xe_xpm.cpp
index 4c02fbb..e1cccba 100644
--- a/media_driver/agnostic/Xe_M/Xe_XPM/vp/hal/vphal_render_composite_xe_xpm.cpp
+++ b/media_driver/agnostic/Xe_M/Xe_XPM/vp/hal/vphal_render_composite_xe_xpm.cpp
@@ -126,13 +126,13 @@
 //!
 MOS_STATUS CompositeStateXe_Xpm::GetIntermediateOutput(PVPHAL_SURFACE &output)
 {
-    if (output == &m_Intermediate)
+    if (output == m_Intermediate)
     {
-        output = &m_Intermediate1;
+        output = m_Intermediate1;
     }
     else
     {
-        output = &m_Intermediate;
+        output = m_Intermediate;
     }
     return MOS_STATUS_SUCCESS;
 }
diff --git a/media_driver/agnostic/Xe_R/Xe_HP_base/hw/blt/mhw_blt_xe_hp_base.cpp b/media_driver/agnostic/Xe_R/Xe_HP_base/hw/blt/mhw_blt_xe_hp_base.cpp
index 50bf8a2..ad2a3bb 100644
--- a/media_driver/agnostic/Xe_R/Xe_HP_base/hw/blt/mhw_blt_xe_hp_base.cpp
+++ b/media_driver/agnostic/Xe_R/Xe_HP_base/hw/blt/mhw_blt_xe_hp_base.cpp
@@ -315,8 +315,27 @@
 
         if (srcMmcModel != MOS_MEMCOMP_DISABLED)//will enable RC later
         {
-            cmd.DW8.SourceCompressionEnable = 1;
-            cmd.DW12.SourceCompressionFormat = srcCompressionFormat;
+            cmd.DW8.SourceCompressionEnable    = 1;
+            cmd.DW12.SourceCompressionFormat   = srcCompressionFormat;
+            cmd.DW8.SourceAuxiliarysurfacemode =
+                mhw_blt_state_xe_hp_base::XY_BLOCK_COPY_BLT_CMD::SOURCE_AUXILIARY_SURFACE_MODE_AUX_CCS_E;
+            if (srcMmcModel == MOS_MEMCOMP_MC)
+            {   // 1 is MC; 0 is RC;
+                cmd.DW8.SourceControlSurfaceType =
+                    mhw_blt_state_xe_hp_base::XY_BLOCK_COPY_BLT_CMD::SOURCE_CONTROL_SURFACE_TYPE_MEDIA_CONTROL_SURFACE; 
+                if (pFastCopyBltParam->dwPlaneNum >= 2)
+                {
+                    // luma/chroma is represented by the MSB of the 5 bit format and used only for media decompression.
+                    if (pFastCopyBltParam->dwPlaneIndex == 0)  // first plane
+                    {
+                        cmd.DW12.SourceCompressionFormat = srcCompressionFormat & 0x0F;
+                    }
+                    else  // second or third
+                    {
+                        cmd.DW12.SourceCompressionFormat = srcCompressionFormat | 0x10;
+                    }
+                }
+            }
         }
 
     // add source address
diff --git a/media_driver/agnostic/common/codec/hal/codechal_decode_avc.cpp b/media_driver/agnostic/common/codec/hal/codechal_decode_avc.cpp
index 3adf699..4bac426 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_decode_avc.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_decode_avc.cpp
@@ -1619,28 +1619,23 @@
                 uint8_t picID = picMhwParams->AvcDirectmodeParams.bPicIdRemappingInUse ? i : refList[idx]->ucFrameId;
                 uint8_t mvIdx = refList[idx]->ucDMVIdx[0];
 
-                if (&picMhwParams->AvcDirectmodeParams.presAvcDmvBuffers[i] != nullptr)
-                {
-                    // dump Reference mvdata
-                    std::string mvBufDumpName = "_DEC_Ref_MV_" + std::to_string(i);
-                    CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
-                        &picMhwParams->AvcDirectmodeParams.presAvcDmvBuffers[mvIdx],
-                        CodechalDbgAttr::attrMvData,
-                        mvBufDumpName.c_str(),
-                        m_avcDmvBufferSize));
-                }
+                // dump Reference mvdata
+                std::string mvBufDumpName = "_DEC_Ref_MV_" + std::to_string(i);
+                CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
+                    &picMhwParams->AvcDirectmodeParams.presAvcDmvBuffers[mvIdx],
+                    CodechalDbgAttr::attrMvData,
+                    mvBufDumpName.c_str(),
+                    m_avcDmvBufferSize));
             }
         }
 
-        if (&picMhwParams->AvcDirectmodeParams.presAvcDmvBuffers[picMhwParams->AvcDirectmodeParams.ucAvcDmvIdx])
-        {
-            // dump Current mvdata
-            CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
-            &picMhwParams->AvcDirectmodeParams.presAvcDmvBuffers[picMhwParams->AvcDirectmodeParams.ucAvcDmvIdx],
-                CodechalDbgAttr::attrMvData,
-                "DEC_Cur_MV_",
-                m_avcDmvBufferSize));
-        });
+        // dump Current mvdata
+        CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
+        &picMhwParams->AvcDirectmodeParams.presAvcDmvBuffers[picMhwParams->AvcDirectmodeParams.ucAvcDmvIdx],
+            CodechalDbgAttr::attrMvData,
+            "DEC_Cur_MV_",
+            m_avcDmvBufferSize));
+        );
 
     return eStatus;
 }
diff --git a/media_driver/agnostic/common/codec/hal/codechal_decode_hevc.cpp b/media_driver/agnostic/common/codec/hal/codechal_decode_hevc.cpp
index 69cbcbf..898ab8e 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_decode_hevc.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_decode_hevc.cpp
@@ -1599,6 +1599,9 @@
         cmdBufferInUse,
         &hucDmemStateParams));
 
+    CODECHAL_DEBUG_TOOL(
+        CODECHAL_DECODE_CHK_STATUS_RETURN(DumpHucS2l(&hucDmemStateParams));)
+
     return eStatus;
 }
 
@@ -3237,4 +3240,19 @@
     return MOS_STATUS_SUCCESS;
 }
 
+MOS_STATUS CodechalDecodeHevc::DumpHucS2l(PMHW_VDBOX_HUC_DMEM_STATE_PARAMS hucDmemStateParams)
+{
+    CODECHAL_DEBUG_FUNCTION_ENTER;
+
+    CODECHAL_DEBUG_CHK_NULL(m_debugInterface);
+
+    CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpHucDmem(
+        hucDmemStateParams->presHucDataSource,
+        m_dmemTransferSize,
+        0,
+        hucRegionDumpDefault));
+
+    return MOS_STATUS_SUCCESS;
+}
+
 #endif
diff --git a/media_driver/agnostic/common/codec/hal/codechal_decode_hevc.h b/media_driver/agnostic/common/codec/hal/codechal_decode_hevc.h
index 7b505d9..cb2d661 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_decode_hevc.h
+++ b/media_driver/agnostic/common/codec/hal/codechal_decode_hevc.h
@@ -494,6 +494,8 @@
     MOS_STATUS DumpIQParams(
         PCODECHAL_HEVC_IQ_MATRIX_PARAMS matrixData);
 
+    MOS_STATUS DumpHucS2l(PMHW_VDBOX_HUC_DMEM_STATE_PARAMS hucDmemStateParams);
+
 #endif
 
     static const uint32_t  m_hucS2lKernelId = 1;             //!< VDBox Huc decode S2L kernel descriptoer
diff --git a/media_driver/agnostic/common/codec/hal/codechal_decode_vp9.cpp b/media_driver/agnostic/common/codec/hal/codechal_decode_vp9.cpp
index 8c1c6e6..6a40b5c 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_decode_vp9.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_decode_vp9.cpp
@@ -1296,6 +1296,9 @@
         CODECHAL_DECODE_CHK_STATUS_RETURN(DumpDecodePicParams(
             m_vp9PicParams));
 
+        CODECHAL_DECODE_CHK_STATUS_RETURN(DumpDecodeSliceParams(
+            m_vp9SliceParams));
+
         if (m_vp9SegmentParams) {
             CODECHAL_DECODE_CHK_STATUS_RETURN(DumpDecodeSegmentParams(
                 m_vp9SegmentParams));
@@ -2149,6 +2152,28 @@
     return MOS_STATUS_SUCCESS;
 }
 
+MOS_STATUS CodechalDecodeVp9::DumpDecodeSliceParams(CODEC_VP9_SLICE_PARAMS *slcParams)
+{
+    CODECHAL_DEBUG_FUNCTION_ENTER;
+
+    if (slcParams == nullptr)
+    {
+        return MOS_STATUS_SUCCESS;
+    }
+
+    if (m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrSlcParams))
+    {
+        const char *fileName = m_debugInterface->CreateFileName(
+            "_DEC",
+            CodechalDbgBufferType::bufSlcParams,
+            CodechalDbgExtType::txt);
+
+        DumpDecodeVp9SliceParams(slcParams, fileName);
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
 MOS_STATUS CodechalDecodeVp9::DumpDecodeSegmentParams(
     PCODEC_VP9_SEGMENT_PARAMS segmentParams)
 {
diff --git a/media_driver/agnostic/common/codec/hal/codechal_decode_vp9.h b/media_driver/agnostic/common/codec/hal/codechal_decode_vp9.h
index 713f953..3c86c55 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_decode_vp9.h
+++ b/media_driver/agnostic/common/codec/hal/codechal_decode_vp9.h
@@ -405,6 +405,9 @@
 
     MOS_STATUS DumpDecodeSegmentParams(
         PCODEC_VP9_SEGMENT_PARAMS segmentParams);
+
+    MOS_STATUS DumpDecodeSliceParams(
+        CODEC_VP9_SLICE_PARAMS *slcParams);
 #endif
 };
 
diff --git a/media_driver/agnostic/common/codec/hal/codechal_decoder.h b/media_driver/agnostic/common/codec/hal/codechal_decoder.h
index a94021f..249e785 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_decoder.h
+++ b/media_driver/agnostic/common/codec/hal/codechal_decoder.h
@@ -173,10 +173,16 @@
     PMOS_RESOURCE           m_currHistogramOutBuf = nullptr;
     //! \brief Applies when debug dumps are enabled, pointer to AV1 film grain output resource for the picture associated with this status report
     PMOS_RESOURCE           m_currFgOutputPicRes = nullptr;
-    //! \brief Applies when debug dumps are enabled, stream out buffer
+    //! \brief Applies when debug dumps are enabled, stream out buffer (legacy)
     PMOS_RESOURCE           m_streamOutBuf = nullptr;
-    //! \brief Applies when debug dumps are enabled, index of the streamout buffer
+    //! \brief Applies when debug dumps are enabled, index of the streamout buffer (legacy)
     uint32_t                m_streamoutIdx = 0;
+    //! \brief Applies when debug dumps are enabled, stream in buffer
+    MOS_RESOURCE            m_streamInBufRes = {0};
+    //! \brief Applies when debug dumps are enabled, stream out buffer
+    MOS_RESOURCE            m_streamOutBufRes = {0};
+    //! \brief Applies when debug dumps are enabled, stream size
+    uint32_t                m_streamSize = 0;
     //! \brief Applies when debug dumps are enabled, indicates whether or not this is the final field in the frame.
     bool                    m_secondField = false;
     //! \brief Applies to VC1 only, indicates whether or not the frame required OLP.
diff --git a/media_driver/agnostic/common/codec/hal/codechal_encode_hevc_base.cpp b/media_driver/agnostic/common/codec/hal/codechal_encode_hevc_base.cpp
index 8f61c09..eab128c 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_encode_hevc_base.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_encode_hevc_base.cpp
@@ -1663,7 +1663,7 @@
 
 MOS_STATUS CodechalEncodeHevcBase::SubmitCommandBuffer(
     PMOS_COMMAND_BUFFER cmdBuffer,
-    bool                nullRendering)
+    bool                bNullRendering)
 {
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
 
@@ -1671,7 +1671,7 @@
 
     CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
 
-    CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, nullRendering));
+    CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, bNullRendering));
     return eStatus;
 }
 
@@ -2423,6 +2423,22 @@
 #endif
 }
 
+void CodechalEncodeHevcBase::SetHcpRefSurfaceParams(MHW_VDBOX_SURFACE_PARAMS &refSurfaceParams)
+{
+    MOS_ZeroMemory(&refSurfaceParams, sizeof(refSurfaceParams));
+    refSurfaceParams.Mode                     = m_mode;
+    refSurfaceParams.psSurface                = &m_reconSurface;
+    refSurfaceParams.ucSurfaceStateId         = CODECHAL_HCP_REF_SURFACE_ID;
+    refSurfaceParams.ucBitDepthLumaMinus8     = m_hevcSeqParams->bit_depth_luma_minus8;
+    refSurfaceParams.ucBitDepthChromaMinus8   = m_hevcSeqParams->bit_depth_chroma_minus8;
+    refSurfaceParams.ChromaType               = m_outputChromaFormat;
+    refSurfaceParams.dwActualHeight           = ((m_hevcSeqParams->wFrameHeightInMinCbMinus1 + 1) << (m_hevcSeqParams->log2_min_coding_block_size_minus3 + 3));
+    refSurfaceParams.dwReconSurfHeight        = m_rawSurfaceToPak->dwHeight;
+#ifdef _MMC_SUPPORTED
+    m_mmcState->SetSurfaceState(&refSurfaceParams);
+#endif
+}
+
 void CodechalEncodeHevcBase::SetHcpPipeBufAddrParams(MHW_VDBOX_PIPE_BUF_ADDR_PARAMS& pipeBufAddrParams)
 {
     CODECHAL_ENCODE_FUNCTION_ENTER;
diff --git a/media_driver/agnostic/common/codec/hal/codechal_encode_hevc_base.h b/media_driver/agnostic/common/codec/hal/codechal_encode_hevc_base.h
index 0dfe12a..4cafad4 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_encode_hevc_base.h
+++ b/media_driver/agnostic/common/codec/hal/codechal_encode_hevc_base.h
@@ -1095,7 +1095,7 @@
     //!
     virtual MOS_STATUS SubmitCommandBuffer(
         PMOS_COMMAND_BUFFER cmdBuffer,
-        bool                nullRendering);
+        bool                bNullRendering);
 
     //!
     //! \brief    Help function to verify command buffer size
@@ -1608,7 +1608,17 @@
     //!
     //! \return   void
     //!
-    virtual void SetHcpReconSurfaceParams(MHW_VDBOX_SURFACE_PARAMS& reconSurfaceParams);
+    virtual void SetHcpReconSurfaceParams(MHW_VDBOX_SURFACE_PARAMS &reconSurfaceParams);
+
+    //!
+    //! \brief    Set HCP_SURFACE_PARAMS for reference picture
+    //!
+    //! \param    [in, out] refSurfaceParams
+    //!           HCP_SURFACE_PARAMS for reference picture
+    //!
+    //! \return   void
+    //!
+    virtual void SetHcpRefSurfaceParams(MHW_VDBOX_SURFACE_PARAMS &refSurfaceParams);
 
     //!
     //! \brief    Set HCP_PIPE_BUF_ADDR parameters
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 dc383ae..6187887 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_encoder_base.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_encoder_base.cpp
@@ -4564,7 +4564,7 @@
 
 MOS_STATUS CodechalEncoderState::SubmitCommandBuffer(
     PMOS_COMMAND_BUFFER cmdBuffer,
-    int32_t         nullRendering)
+    bool         bNullRendering)
 {
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
 
@@ -4573,7 +4573,7 @@
     CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
 
     HalOcaInterface::On1stLevelBBEnd(*cmdBuffer, *m_osInterface);
-    CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, nullRendering));
+    CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, bNullRendering));
     return eStatus;
 }
 
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 2c53428..1928664 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_encoder_base.h
+++ b/media_driver/agnostic/common/codec/hal/codechal_encoder_base.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2017-2023, Intel Corporation
+* Copyright (c) 2017-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -953,6 +953,7 @@
 
     uint32_t                        reserved[4];            //!< align with apo path hal structure EncodeStatusReportData
 
+    uint32_t                        MSE[3];
 };
 
 //!
@@ -1893,7 +1894,7 @@
     //!
     virtual MOS_STATUS SubmitCommandBuffer(
         PMOS_COMMAND_BUFFER cmdBuffer,
-        int32_t             nullRendering);
+        bool             bNullRendering);
 
     //!
     //! \brief  Check Supported Format
diff --git a/media_driver/agnostic/common/codec/hal/codechal_mmc.cpp b/media_driver/agnostic/common/codec/hal/codechal_mmc.cpp
index daba716..978bbca 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_mmc.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_mmc.cpp
@@ -97,6 +97,55 @@
     return eStatus;
 }
 
+MOS_STATUS CodecHalMmcState::GetSurfaceMmcState(PMOS_SURFACE surface,MOS_MEMCOMP_STATE *mmcState)
+{
+    MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
+
+    CODECHAL_HW_FUNCTION_ENTER;
+
+    MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, surface);
+    MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, mmcState);
+    MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, m_osInterface);    
+
+    if (m_mmcEnabled)
+    {
+        CODECHAL_HW_CHK_STATUS_RETURN(m_osInterface->pfnGetMemoryCompressionMode(
+            m_osInterface,
+            &surface->OsResource,
+            (PMOS_MEMCOMP_STATE)&surface->CompressionMode));
+        *mmcState = (MOS_MEMCOMP_STATE)surface->CompressionMode;
+    }
+    else
+    {
+        *mmcState = MOS_MEMCOMP_DISABLED;
+    }
+
+    return eStatus;
+}
+
+ MOS_STATUS CodecHalMmcState::GetSurfaceMmcFormat(
+    PMOS_SURFACE surface,
+    uint32_t    *mmcFormat)
+{
+    MOS_STATUS status = MOS_STATUS_SUCCESS;
+
+    MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, surface);
+    MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, mmcFormat);
+    MOS_CHK_NULL_RETURN(MOS_COMPONENT_MMC, MOS_MMC_SUBCOMP_SELF, m_osInterface);
+
+    if (m_mmcEnabled)
+    {
+        status = m_osInterface->pfnGetMemoryCompressionFormat(m_osInterface, &surface->OsResource, mmcFormat);
+    } 
+    else
+    {
+        *mmcFormat = 0;
+    }
+
+    return status;
+}     
+     
+
 MOS_STATUS CodecHalMmcState::
 DisableSurfaceMmcState(PMOS_SURFACE surface)
 {
diff --git a/media_driver/agnostic/common/codec/hal/codechal_mmc.h b/media_driver/agnostic/common/codec/hal/codechal_mmc.h
index 478b374..4deae22 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_mmc.h
+++ b/media_driver/agnostic/common/codec/hal/codechal_mmc.h
@@ -77,6 +77,30 @@
     MOS_STATUS GetSurfaceMmcState(PMOS_SURFACE surface);
 
     //!
+    //! \brief    Get surface memory compression state
+    //! \param    [out] surface
+    //!           Pointer to PMOS_SURFACE
+    //! \param    [in, out] mmcState
+    //!           Pointer to MOS_MEMCOMP_STATE
+    //!
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!    
+    MOS_STATUS GetSurfaceMmcState(PMOS_SURFACE surface, MOS_MEMCOMP_STATE *mmcState);
+
+    //!
+    //! \brief    Get surface memory compression state
+    //! \param    [out] surface
+    //!           Pointer to PMOS_SURFACE
+    //! \param    [in, out] mmcFormat
+    //!           Pointer to MMC Format
+    //!
+    //! \return   MOS_STATUS
+    //!           MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    MOS_STATUS GetSurfaceMmcFormat(PMOS_SURFACE surface, uint32_t *mmcFormat);
+
+    //!
     //! \brief    Disable surface memory compression state
     //! \param    [in,out] surface
     //!           Pointer to PMOS_SURFACE
diff --git a/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.cpp b/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.cpp
index 8c926ce..2cea08f 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.cpp
@@ -1490,6 +1490,13 @@
     MHW_VDBOX_PIPE_BUF_ADDR_PARAMS& pipeBufAddrParams)
 {
     pipeBufAddrParams = {};
+
+    //set MMC flag
+    if (m_mmcState->IsMmcEnabled())
+    {
+        pipeBufAddrParams.bMmcEnabled = true;
+    }
+
     pipeBufAddrParams.Mode = CODECHAL_ENCODE_MODE_HEVC;
     pipeBufAddrParams.psRawSurface = m_rawSurfaceToPak;
     pipeBufAddrParams.ps4xDsSurface = m_trackedBuf->Get4xDsReconSurface(CODEC_CURR_TRACKED_BUFFER);
diff --git a/media_driver/agnostic/common/codec/hal/codechal_vdenc_vp9_base.cpp b/media_driver/agnostic/common/codec/hal/codechal_vdenc_vp9_base.cpp
index b96a5e9..2043f3c 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_vdenc_vp9_base.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_vdenc_vp9_base.cpp
@@ -4669,7 +4669,7 @@
 
 MOS_STATUS CodechalVdencVp9State::SubmitCommandBuffer(
     PMOS_COMMAND_BUFFER cmdBuffer,
-    bool nullRendering)
+    bool bNullRendering)
 {
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
 
@@ -4677,7 +4677,7 @@
 
     CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
    
-    CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, nullRendering));   
+    CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, bNullRendering));
 
     return eStatus;
 }
diff --git a/media_driver/agnostic/common/codec/hal/codechal_vdenc_vp9_base.h b/media_driver/agnostic/common/codec/hal/codechal_vdenc_vp9_base.h
index 9fdd9b4..9a0803a 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_vdenc_vp9_base.h
+++ b/media_driver/agnostic/common/codec/hal/codechal_vdenc_vp9_base.h
@@ -2403,7 +2403,7 @@
 
     virtual MOS_STATUS SubmitCommandBuffer(
         PMOS_COMMAND_BUFFER cmdBuffer,
-        bool nullRendering);
+        bool bNullRendering);
 
 #if USE_CODECHAL_DEBUG_TOOL
     MOS_STATUS DumpSegmentParams(
diff --git a/media_driver/agnostic/common/os/mos_graphicsresource.h b/media_driver/agnostic/common/os/mos_graphicsresource.h
index 5bc56ef..15e8753 100644
--- a/media_driver/agnostic/common/os/mos_graphicsresource.h
+++ b/media_driver/agnostic/common/os/mos_graphicsresource.h
@@ -314,18 +314,6 @@
     MOS_STATUS Dump(OsContext* osContextPtr, uint32_t overrideOffset, uint32_t overrideSize, std::string outputFileName, std::string outputPath);
 
     //!
-    //! \brief  Add a sync tag to the graphic resource
-    //! \param  [in] osContextPtr
-    //!         Pointer to the osContext handle
-    //! \param  [in] params
-    //!         Parameters to do the synchronization
-    //! \param  [in] streamIndex
-    //!         Stream index to indicate which stream this resource belongs to
-    //! \return MOS_STATUS_SUCCESS on success case, MOS error status on fail cases
-    //!
-    virtual MOS_STATUS SetSyncTag(OsContext* osContextPtr, SyncParams& params, uint32_t streamIndex) = 0;
-
-    //!
     //! \brief  Check whether the resource is nullptr
     //! \param  [in] pResource
     //!         ptr to the graphics resource to be checked
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 fda5e37..8942e9e 100644
--- a/media_driver/agnostic/common/shared/mediacopy/media_blt_copy.cpp
+++ b/media_driver/agnostic/common/shared/mediacopy/media_blt_copy.cpp
@@ -161,6 +161,8 @@
 //!           [in] Pointer to input surface
 //! \param    outputSurface
 //!           [in] Pointer to output surface
+//! \param    planeIndex
+//!           [in] Pointer to YUV(RGB) plane index
 //! \return   MOS_STATUS
 //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
 //!
@@ -174,7 +176,9 @@
     BLT_CHK_NULL_RETURN(inputSurface);
     BLT_CHK_NULL_RETURN(outputSurface);
     BLT_CHK_NULL_RETURN(outputSurface->pGmmResInfo);
+    BLT_CHK_NULL_RETURN(inputSurface->pGmmResInfo);
 
+    PGMM_RESOURCE_INFO TiledRsInfo  = nullptr;
     uint32_t          BytesPerTexel = 1;
     MOS_SURFACE       ResDetails;
     MOS_ZeroMemory(&ResDetails, sizeof(MOS_SURFACE));
@@ -187,12 +191,14 @@
     uint32_t inputPitch  = ResDetails.dwPitch;
 
     if (inputSurface->TileType != MOS_TILE_LINEAR)
-    { 
+    { ///for tiled surfaces, pitch is expressed in DWORDs
         pMhwBltParams->dwSrcPitch = ResDetails.dwPitch / 4;
+        TiledRsInfo               = inputSurface->pGmmResInfo;
     }
     else
     {
         pMhwBltParams->dwSrcPitch = ResDetails.dwPitch;
+        TiledRsInfo               = outputSurface->pGmmResInfo;
     }
     
     pMhwBltParams->dwSrcTop    = ResDetails.RenderOffset.YUV.Y.YOffset;
@@ -207,7 +213,7 @@
     uint32_t outputPitch  = ResDetails.dwPitch;
 
     if (outputSurface->TileType != MOS_TILE_LINEAR)
-    {
+    {// /for tiled surfaces, pitch is expressed in DWORDs
         pMhwBltParams->dwDstPitch = ResDetails.dwPitch/4;
     }
     else
@@ -218,16 +224,8 @@
     pMhwBltParams->dwDstLeft   = ResDetails.RenderOffset.YUV.Y.XOffset;
 
     int planeNum = GetPlaneNum(ResDetails.Format);
-    pMhwBltParams->dwDstRight = std::min(inputWidth, outputWidth);
-
-    if (outputSurface->pGmmResInfo->GetResourceType() != RESOURCE_BUFFER)
-    {
-        BytesPerTexel = outputSurface->pGmmResInfo->GetBitsPerPixel() / 8;  // using Bytes.
-        if (ResDetails.Format == Format_P010 || ResDetails.Format == Format_P016)
-        {
-            BytesPerTexel = 2;
-        }
-    }
+    pMhwBltParams->dwDstBottom = std::min(inputHeight, outputHeight);
+    BytesPerTexel = TiledRsInfo->GetBitsPerPixel() / 8;  // using Bytes.
 
     if (true == m_blokCopyon)
     {
@@ -237,10 +235,10 @@
     {
         pMhwBltParams->dwColorDepth = GetFastCopyColorDepth(outputSurface->pGmmResInfo->GetResourceFormat(), BytesPerTexel);
     }
-
-    if( 1 == planeNum )
+    pMhwBltParams->dwPlaneIndex = planeIndex;
+    pMhwBltParams->dwPlaneNum   = planeNum;
+    if (SINGLE_PLANE == planeNum)
     {// handle as whole memory
-       pMhwBltParams->dwDstBottom = std::min(inputHeight, outputHeight);
        if (false == m_blokCopyon)
        {// fastcopy
            pMhwBltParams->dwDstRight   = std::min(inputPitch, outputPitch) / 4;  // Regard as 32 bit per pixel format, i.e. 4 byte per pixel.
@@ -248,17 +246,15 @@
        }
        else
        {
-           // Block copy
-           pMhwBltParams->dwDstRight = std::min(inputPitch, outputPitch) / 4;  // Regard as 32 bit per pixel format, i.e. 4 byte per pixel.
-           pMhwBltParams->dwColorDepth = 2;  //0:8bit 1:16bit 2:32bit
+           pMhwBltParams->dwDstRight  = std::min(inputWidth, outputWidth);
        }
     }
     else
     {
         int bytePerTexelScaling    = GetBytesPerTexelScaling(ResDetails.Format);
-        pMhwBltParams->dwDstBottom = std::min(inputHeight, outputHeight);
+        pMhwBltParams->dwDstRight  = std::min(inputWidth, outputWidth);
 
-        if (1 == planeIndex || 2 == planeIndex)
+        if (MCPY_PLANE_U == planeIndex || MCPY_PLANE_V == planeIndex)
         {
            pMhwBltParams->dwDstBottom = pMhwBltParams->dwDstBottom / bytePerTexelScaling;
            if (ResDetails.Format == Format_I420 || ResDetails.Format == Format_YV12)
@@ -346,7 +342,7 @@
             &fastCopyBltParam,
             pBltStateParam->pSrcSurface,
             pBltStateParam->pDstSurface,
-            0));
+            MCPY_PLANE_Y));
 
         MHW_MI_LOAD_REGISTER_IMM_PARAMS RegisterDwParams;
         MOS_ZeroMemory(&RegisterDwParams, sizeof(RegisterDwParams));
@@ -373,37 +369,32 @@
             srcResDetails.YPlaneOffset.iSurfaceOffset,
             dstResDetails.YPlaneOffset.iSurfaceOffset));
 
-        if (planeNum >= 2)
+        if (planeNum == TWO_PLANES || planeNum == THREE_PLANES)
         {
             BLT_CHK_STATUS_RETURN(SetupBltCopyParam(
              &fastCopyBltParam,
              pBltStateParam->pSrcSurface,
              pBltStateParam->pDstSurface,
-             1));
+             MCPY_PLANE_U));
             BLT_CHK_STATUS_RETURN(m_bltInterface->AddBlockCopyBlt(
                  &cmdBuffer,
                  &fastCopyBltParam,
                  srcResDetails.UPlaneOffset.iSurfaceOffset,
                  dstResDetails.UPlaneOffset.iSurfaceOffset));
 
-              if (planeNum == 3)
+              if (planeNum == THREE_PLANES)
               {
                   BLT_CHK_STATUS_RETURN(SetupBltCopyParam(
                       &fastCopyBltParam,
                       pBltStateParam->pSrcSurface,
                       pBltStateParam->pDstSurface,
-                      2));
+                      MCPY_PLANE_V));
                   BLT_CHK_STATUS_RETURN(m_bltInterface->AddBlockCopyBlt(
                       &cmdBuffer,
                       &fastCopyBltParam,
                       srcResDetails.VPlaneOffset.iSurfaceOffset,
                       dstResDetails.VPlaneOffset.iSurfaceOffset));
               }
-              else if (planeNum > 3)
-              {
-                  MCPY_ASSERTMESSAGE("illegal usage");
-                  return MOS_STATUS_INVALID_PARAMETER;
-              }
          }
     }
 
@@ -424,40 +415,37 @@
     GMM_RESOURCE_FORMAT dstFormat,
     uint32_t            BytesPerTexel)
 {
-    uint32_t bitsPerTexel = BytesPerTexel * BLT_BITS_PER_BYTE;
-
-    switch (bitsPerTexel)
-    {
-     case 8:
-         return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_8BITCOLOR;
-         break;
-     case 16:
-         switch (dstFormat)
-         {
-           case GMM_FORMAT_B5G5R5A1_UNORM:
-               return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_32BITCOLOR;
-               break;
-           default:
-               return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_16BITCOLOR;;
-               break;
-         }
-         break;
-     case 64:
-         return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_64BITCOLOR;
-         break;
-     case 96:
-         return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_32BITCOLOR;
-         break;
-     case 128:
-         return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_128BITCOLOR;
-         break;
-     default:
-         return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_32BITCOLOR;
-         break;
+    uint32_t BitsPerPixel = BytesPerTexel * BLT_BITS_PER_BYTE;
+    if (dstFormat == GMM_FORMAT_YUY2_2x1 || dstFormat == GMM_FORMAT_Y216_TYPE || dstFormat == GMM_FORMAT_Y210)
+    {   // GMM_FORMAT_YUY2_2x1 32bpe 2x1 pixel blocks instead of 16bpp 1x1 block
+        // GMM_FORMAT_Y216_TYPE/Y210 64bpe pixel blocks instead of 32bpp block.
+         BitsPerPixel = BitsPerPixel / 2;
     }
 
- }
-
+    switch (BitsPerPixel)
+    {
+    case 16:
+         switch (dstFormat)
+         {
+         case GMM_FORMAT_B5G5R5A1_UNORM:
+              return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_32BITCOLOR;
+         default:
+              return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_16BITCOLOR;
+         }
+    case 32:
+         return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_32BITCOLOR;
+    case 64:
+         return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_64BITCOLOR;
+    case 96:
+         MCPY_ASSERTMESSAGE("96 BitPerPixel support limimated as Linear format %d", dstFormat);
+         return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_96BITCOLOR_ONLYLINEARCASEISSUPPORTED;
+    case 128:
+         return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_128BITCOLOR;
+    case 8:
+    default:
+         return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_8BITCOLOR;
+    }
+}
 uint32_t BltState::GetFastCopyColorDepth(
      GMM_RESOURCE_FORMAT dstFormat,
      uint32_t            BytesPerTexel)
@@ -513,14 +501,14 @@
 int BltState::GetPlaneNum(MOS_FORMAT format)
 {
 
-  int  planeNum = 1;
+  int planeNum = SINGLE_PLANE;
 
    switch (format)
    {
        case Format_NV12:
        case Format_P010:
        case Format_P016:
-            planeNum = 2;
+           planeNum = TWO_PLANES;
            break;
        case Format_YV12:
        case Format_I420:
@@ -531,10 +519,10 @@
        case Format_411P:
        case Format_422V:
        case Format_422H:
-            planeNum = 3;
+            planeNum = THREE_PLANES;
             break;
        default:
-            planeNum = 1;
+            planeNum = SINGLE_PLANE;
            break;
     }
    return planeNum;
diff --git a/media_driver/agnostic/common/shared/mediacopy/media_blt_copy.h b/media_driver/agnostic/common/shared/mediacopy/media_blt_copy.h
index a46546d..7bff1e2 100644
--- a/media_driver/agnostic/common/shared/mediacopy/media_blt_copy.h
+++ b/media_driver/agnostic/common/shared/mediacopy/media_blt_copy.h
@@ -105,8 +105,8 @@
     //!           [in] Pointer to input surface
     //! \param    outputSurface
     //!           [in] Pointer to output surface
-    //! \param    plane index
-    //!           [in] plan index, e.g Y plane index 0, UV plane index 1.
+    //! \param    planeIndex
+    //!           [in] Pointer to YUV(RGB) plane index
     //! \return   MOS_STATUS
     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
     //!
@@ -147,10 +147,10 @@
     //!
     //! \brief    Get Block copy color depth.
     //! \details  get different format's color depth.
-    //! \param    surface 
-    //!           [in] input or output surface.
-    //! \return   MOS_STATUS
-    //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
+    //! \param    Gmm format and bits perf block
+    //!           [in] Gmm format, Bits per Block;
+    //! \return   color depth
+    //!           Return color depth
     //!
     uint32_t GetBlkCopyColorDepth(
         GMM_RESOURCE_FORMAT dstFormat,
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 0046fb6..69265c5 100644
--- a/media_driver/agnostic/common/shared/mediacopy/media_vebox_copy.cpp
+++ b/media_driver/agnostic/common/shared/mediacopy/media_vebox_copy.cpp
@@ -113,11 +113,8 @@
     outputSurface.OsResource = *dst;
     VEBOX_COPY_CHK_STATUS_RETURN(GetResourceInfo(&outputSurface));
 
-    if (!IsFormatSupported(&inputSurface))
-    {
-        VEBOX_COPY_ASSERTMESSAGE("UnSupported Format.");
-        return MOS_STATUS_UNIMPLEMENTED;
-    }
+    // For RGB10/BGR10/Y210/Y410/A8, use other format instead. No need to check format again.
+    AdjustSurfaceFormat(inputSurface);
 
     veboxInterface = m_veboxInterface;
 
@@ -225,7 +222,7 @@
     return eStatus;
 }
 
-bool VeboxCopyState::IsFormatSupported(PMOS_RESOURCE surface)
+bool VeboxCopyState::IsSurfaceSupported(PMOS_RESOURCE surface)
 {
     bool supported = false;
     MOS_SURFACE inputSurface;
@@ -240,7 +237,7 @@
     inputSurface.OsResource = *surface;
     GetResourceInfo(&inputSurface);
 
-    supported = IsFormatSupported(&inputSurface);
+    supported = IsVeCopySupportedFormat(inputSurface.Format);
 
     if (inputSurface.TileType == MOS_TILE_LINEAR &&
         (inputSurface.dwPitch % 64))
@@ -522,68 +519,54 @@
     return eStatus;
 }
 
-bool VeboxCopyState::IsFormatSupported(PMOS_SURFACE surface)
+bool VeboxCopyState::IsVeCopySupportedFormat(MOS_FORMAT format)
 {
-    bool    bRet = false;
+    if (format == Format_R10G10B10A2 ||
+        format == Format_B10G10R10A2 ||
+        format == Format_A8R8G8B8 ||
+        format == Format_A8B8G8R8 ||
+        format == Format_X8R8G8B8 ||
+        format == Format_X8B8G8R8 ||
+        IS_RGB64_FLOAT_FORMAT(format) ||
 
-    if (surface->Format == Format_R10G10B10A2 ||
-        surface->Format == Format_B10G10R10A2 ||
-        surface->Format == Format_Y410 ||
-        surface->Format == Format_Y210)
+        format == Format_AYUV ||
+        format == Format_Y410 ||
+        format == Format_Y416 ||
+        format == Format_Y210 ||
+        format == Format_Y216 ||
+        format == Format_YUY2 ||
+        format == Format_NV12 ||
+        format == Format_P010 ||
+        format == Format_P016 ||
+
+        format == Format_A8 ||
+        format == Format_Y8 ||
+        format == Format_L8 ||
+        format == Format_P8 ||
+        format == Format_Y16U)
     {
-        // Re-map RGB10/RGB10/Y410/Y210 as AYUV
-        surface->Format = Format_AYUV;
+        return true;
     }
-
-    if (surface->Format == Format_A8 ||
-        surface->Format == Format_Y8 ||
-        surface->Format == Format_L8 ||
-        surface->Format == Format_P8 ||
-        surface->Format == Format_STMM)
+    else
     {
-        surface->Format = Format_P8;
+        VEBOX_COPY_NORMALMESSAGE("Unsupported format '0x%08x' for VEBOX copy.", format);
+        return false;
     }
+}
 
-    if (surface->Format == Format_IMC3 ||
-        surface->Format == Format_444P ||
-        surface->Format == Format_422H ||
-        surface->Format == Format_422V ||
-        surface->Format == Format_411P ||
-        surface->Format == Format_411R ||
-        surface->Format == Format_444P ||
-        surface->Format == Format_RGBP ||
-        surface->Format == Format_BGRP ||
-        surface->Format == Format_400P ||
-        surface->Format == Format_420O ||
-        surface->Format == Format_Buffer)
+void VeboxCopyState::AdjustSurfaceFormat(MOS_SURFACE &surface)
+{
+    if (surface.Format == Format_R10G10B10A2 ||
+        surface.Format == Format_B10G10R10A2 ||
+        surface.Format == Format_Y410        ||
+        surface.Format == Format_Y210)
     {
-        surface->Format   = Format_P8;
-        surface->dwHeight = surface->dwSize / surface->dwPitch;
+        // RGB10 not supported without IECP. Re-map RGB10/RGB10 as AYUV
+        // Y410/Y210 has HW issue. Remap to AYUV.
+        surface.Format = Format_AYUV;
     }
-
-    if (IS_RGB64_FLOAT_FORMAT(surface->Format))
+    else if (surface.Format == Format_A8)
     {
-        surface->Format = Format_Y416;
+        surface.Format = Format_P8;
     }
-
-    // Check if Sample Format is supported for decompression
-    if (surface->Format != Format_NV12        &&
-        surface->Format != Format_AYUV        &&
-        surface->Format != Format_Y416        &&
-        surface->Format != Format_P010        &&
-        surface->Format != Format_P016        &&
-        !IS_PA_FORMAT(surface->Format)        &&
-        surface->Format != Format_A8R8G8B8    &&
-        surface->Format != Format_A8B8G8R8    &&
-        surface->Format != Format_X8R8G8B8    &&
-        surface->Format != Format_X8B8G8R8    &&
-        surface->Format != Format_P8)
-    {
-        VEBOX_COPY_NORMALMESSAGE("Unsupported Source Format '0x%08x' for VEBOX Decompression.", surface->Format);
-        return bRet;
-    }
-
-    bRet = true;
-
-    return bRet;
 }
diff --git a/media_driver/agnostic/common/shared/mediacopy/media_vebox_copy.h b/media_driver/agnostic/common/shared/mediacopy/media_vebox_copy.h
index eed2153..7b15b77 100644
--- a/media_driver/agnostic/common/shared/mediacopy/media_vebox_copy.h
+++ b/media_driver/agnostic/common/shared/mediacopy/media_vebox_copy.h
@@ -95,12 +95,12 @@
         PMOS_RESOURCE dst);
 
     //!
-    //! Is Vebox Tile Convert/Decompression Format supported
-    //! \param    [in/out]     surface
-    //!           Pointer to Output Surface parameters
+    //! Is ve copy supported surface
+    //! \param    [in]     surface
+    //!           Pointer to surface parameters
     //! \return   true if supported, else false.
     //!
-    bool IsFormatSupported(PMOS_RESOURCE surface);
+    bool IsSurfaceSupported(PMOS_RESOURCE surface);
 
     //!
     //! \brief    Setup Vebox_Surface_State Command parameter
@@ -139,12 +139,14 @@
         PMOS_COMMAND_BUFFER              cmdBuffer);
 
     //!
-    //! Is Vebox Tile Convert/Decompression Format supported
-    //! \param    [in/out]     surface
+    //! Is ve copy supported format
+    //! \param    [in/out]     surface mos format
     //!           Pointer to Output Surface parameters
     //! \return   true if supported, else false.
     //!
-    bool IsFormatSupported(PMOS_SURFACE surface);
+    virtual bool IsVeCopySupportedFormat(MOS_FORMAT format);
+
+    virtual void AdjustSurfaceFormat(MOS_SURFACE &surface);
 
 protected:
     PMOS_INTERFACE       m_osInterface   = nullptr;
diff --git a/media_driver/agnostic/common/vp/hal/vphal.cpp b/media_driver/agnostic/common/vp/hal/vphal.cpp
index 1fbc847..99668e9 100755
--- a/media_driver/agnostic/common/vp/hal/vphal.cpp
+++ b/media_driver/agnostic/common/vp/hal/vphal.cpp
@@ -875,7 +875,14 @@
     pStatusTable         = &m_statusTable;
     uiNewHead            = pStatusTable->uiHead; // uiNewHead start from previous head value
     // entry length from head to tail
-    uiTableLen           = (pStatusTable->uiCurrent - pStatusTable->uiHead) & (VPHAL_STATUS_TABLE_MAX_SIZE - 1);
+    if (pStatusTable->uiCurrent < pStatusTable->uiHead)
+    {
+        uiTableLen = pStatusTable->uiCurrent + VPHAL_STATUS_TABLE_MAX_SIZE - pStatusTable->uiHead;
+    }
+    else
+    {
+        uiTableLen = pStatusTable->uiCurrent - pStatusTable->uiHead;
+    }
 
     // step 1 - update pStatusEntry from driver if command associated with the dwTag is done by gpu
     for (i = 0; i < wStatusNum && i < uiTableLen; i++)
@@ -948,7 +955,6 @@
         }
     }
     pStatusTable->uiHead = uiNewHead;
-
     // step 2 - mark VPREP_NOTAVAILABLE for unused entry
     for (/* continue from previous i */; i < wStatusNum; i++)
     {
@@ -984,7 +990,14 @@
     pStatusTable = &m_statusTable;
 
     // entry length from head to tail
-    *puiLength = (pStatusTable->uiCurrent - pStatusTable->uiHead) & (VPHAL_STATUS_TABLE_MAX_SIZE - 1);
+    if (pStatusTable->uiCurrent < pStatusTable->uiHead)
+    {
+        *puiLength = pStatusTable->uiCurrent + VPHAL_STATUS_TABLE_MAX_SIZE - pStatusTable->uiHead;
+    }
+    else
+    {
+        *puiLength = pStatusTable->uiCurrent - pStatusTable->uiHead;
+    }
 finish:
 #else
     MOS_UNUSED(puiLength);
diff --git a/media_driver/agnostic/common/vp/hal/vphal_render_common.c b/media_driver/agnostic/common/vp/hal/vphal_render_common.c
index 1e64432..937fcbf 100644
--- a/media_driver/agnostic/common/vp/hal/vphal_render_common.c
+++ b/media_driver/agnostic/common/vp/hal/vphal_render_common.c
@@ -1712,7 +1712,6 @@
             pStatusTable->uiCurrent = uiLast;
         }
     }
-
     pStatusEntry                    = &pStatusTable->aTableEntries[pStatusTable->uiCurrent];
     pStatusEntry->StatusFeedBackID  = dwStatusFeedBackID;
     pStatusEntry->GpuContextOrdinal = eMosGpuContext;
@@ -1721,6 +1720,11 @@
     pStatusEntry->dwStatus          = (eLastStatus == MOS_STATUS_SUCCESS)? VPREP_NOTREADY : VPREP_ERROR;
     pStatusTable->uiCurrent         = (pStatusTable->uiCurrent + 1) & (VPHAL_STATUS_TABLE_MAX_SIZE - 1);
 
+    if (pStatusTable->uiCurrent == pStatusTable->uiHead)
+    {
+        pStatusTable->uiHead = (pStatusTable->uiHead + 1) & (VPHAL_STATUS_TABLE_MAX_SIZE - 1);
+    }
+
     // CM may use a different streamIndex, record it here
     if (pStatusTableUpdateParams->bUpdateStreamIndex)
     {
diff --git a/media_driver/agnostic/common/vp/hal/vphal_render_composite.cpp b/media_driver/agnostic/common/vp/hal/vphal_render_composite.cpp
index f625f39..1690302 100644
--- a/media_driver/agnostic/common/vp/hal/vphal_render_composite.cpp
+++ b/media_driver/agnostic/common/vp/hal/vphal_render_composite.cpp
@@ -1611,7 +1611,7 @@
     if (bMultiplePhases)
     {
         pOsInterface  = m_pOsInterface;
-        pIntermediate = &m_Intermediate;
+        pIntermediate = m_Intermediate;
         PVPHAL_SURFACE &p = pIntermediate;
         // Allocate/Reallocate temporary output
         IntermediateAllocation(p,
@@ -1620,7 +1620,7 @@
             dwTempHeight,
             pTarget);
 
-        pIntermediate = &m_Intermediate1;
+        pIntermediate = m_Intermediate1;
         // Allocate/Reallocate temporary output
         IntermediateAllocation(p,
             pOsInterface,
@@ -1628,7 +1628,7 @@
             dwTempHeight,
             pTarget);
 
-        pIntermediate = &m_Intermediate2;
+        pIntermediate = m_Intermediate2;
 
         // Allocate/Reallocate temporary output
         if (dwTempWidth  > pIntermediate->dwWidth ||
@@ -1723,10 +1723,25 @@
 //!
 MOS_STATUS CompositeState::GetIntermediateOutput(PVPHAL_SURFACE &output)
 {
-    output = &m_Intermediate;
+    output = m_Intermediate;
     return MOS_STATUS_SUCCESS;
 }
 
+PVPHAL_SURFACE CompositeState::GetIntermediateSurface()
+{
+    return &m_IntermediateSurface;
+}
+
+PVPHAL_SURFACE CompositeState::GetIntermediate1Surface()
+{
+    return &m_IntermediateSurface1;
+}
+
+PVPHAL_SURFACE CompositeState::GetIntermediate2Surface()
+{
+    return &m_IntermediateSurface2;
+}
+
 //!
 //! \brief    Adds a source layer for composite
 //! \param    [in,out] pComposite
@@ -1929,8 +1944,11 @@
     PVPHAL_COMPOSITE_PARAMS     pComposite,
     PVPHAL_SURFACE              pTarget)
 {
-    bool    bResult;
-
+    bool    bResult = false;
+    if (nullptr == pTarget)
+    {
+        return bResult;
+    }
     // Set render target
     pComposite->Target[0] = *pTarget;
 
@@ -2053,7 +2071,7 @@
                 // bExtraRotationPhase == true means that Intermediate2 was used as a
                 // temp output resource in the previous phase and now is to be
                 // used as an input
-                pSrc = &m_Intermediate2;
+                pSrc = m_Intermediate2;
                 pSrc->SurfType = SURF_IN_SUBSTREAM; // set the surface type to substream
                 bExtraRotationPhase = false;        // reset rotation phase
             }
@@ -2217,31 +2235,34 @@
                 // using pTarget as a temp resource
                 if (pSrc->pBlendingParams)
                 {
-                    if (m_Intermediate2.pBlendingParams == nullptr)
+                    if (m_Intermediate2 && m_Intermediate2->pBlendingParams == nullptr)
                     {
-                        m_Intermediate2.pBlendingParams = (PVPHAL_BLENDING_PARAMS)
+                        m_Intermediate2->pBlendingParams = (PVPHAL_BLENDING_PARAMS)
                             MOS_AllocAndZeroMemory(sizeof(VPHAL_BLENDING_PARAMS));
                     }
-                    if (m_Intermediate2.pBlendingParams)
+                    if (m_Intermediate2 && m_Intermediate2->pBlendingParams)
                     {
-                        m_Intermediate2.pBlendingParams->BlendType = pSrc->pBlendingParams->BlendType;
-                        m_Intermediate2.pBlendingParams->fAlpha = pSrc->pBlendingParams->fAlpha;
+                        m_Intermediate2->pBlendingParams->BlendType = pSrc->pBlendingParams->BlendType;
+                        m_Intermediate2->pBlendingParams->fAlpha    = pSrc->pBlendingParams->fAlpha;
                     }
                 }
                 else
                 {
                     // clear the blending params if it was set from the previous phase
-                    if (m_Intermediate2.pBlendingParams)
+                    if (m_Intermediate2 && m_Intermediate2->pBlendingParams)
                     {
-                        MOS_FreeMemory(m_Intermediate2.pBlendingParams);
-                        m_Intermediate2.pBlendingParams = nullptr;
+                        MOS_FreeMemory(m_Intermediate2->pBlendingParams);
+                        m_Intermediate2->pBlendingParams = nullptr;
                     }
                 }
 
                 // update the output rectangles with the input rectangles
-                m_Intermediate2.rcDst = m_Intermediate2.rcSrc = pSrc->rcDst;
+                if (m_Intermediate2)
+                {
+                    m_Intermediate2->rcDst = m_Intermediate2->rcSrc = pSrc->rcDst;
+                }
 
-                AddCompTarget(&CompositeParams, &m_Intermediate2);
+                AddCompTarget(&CompositeParams, m_Intermediate2);
                 // Force output as "render target" surface type
                 CompositeParams.Target[0].SurfType = SURF_OUT_RENDERTARGET;
 
@@ -2315,7 +2336,12 @@
     pOsInterface = m_pOsInterface;
     pRenderHal   = m_pRenderHal;
     pPerfData    = GetPerfData();
-
+    m_Intermediate  = GetIntermediateSurface();
+    VPHAL_RENDER_CHK_NULL(m_Intermediate);
+    m_Intermediate1 = GetIntermediate1Surface();
+    VPHAL_RENDER_CHK_NULL(m_Intermediate1);
+    m_Intermediate2 = GetIntermediate2Surface();
+    VPHAL_RENDER_CHK_NULL(m_Intermediate2);
     // Reset compositing sources
     iSources  = 0;
     iProcamp  = 0;
@@ -2497,22 +2523,22 @@
     }
     else
     {
-        pOutput = &m_Intermediate;
+        pOutput = m_Intermediate;
         pOutput->ColorSpace = ColorSpace;
-        m_Intermediate2.ColorSpace = ColorSpace;
+        m_Intermediate2->ColorSpace = ColorSpace;
 
         // Set AYUV or ARGB output depending on intermediate cspace
         if (KernelDll_IsCspace(ColorSpace, CSpace_RGB))
         {
             pOutput->Format = Format_A8R8G8B8;
-            m_Intermediate1.Format = Format_A8R8G8B8;
-            m_Intermediate2.Format = Format_A8R8G8B8;
+            m_Intermediate1->Format = Format_A8R8G8B8;
+            m_Intermediate2->Format = Format_A8R8G8B8;
         }
         else
         {
             pOutput->Format = Format_AYUV;
-            m_Intermediate1.Format = Format_AYUV;
-            m_Intermediate2.Format = Format_AYUV;
+            m_Intermediate1->Format = Format_AYUV;
+            m_Intermediate2->Format = Format_AYUV;
         }
     }
 
@@ -7452,25 +7478,32 @@
 
     // Free intermediate compositing buffer
 
-    if (m_Intermediate2.pBlendingParams)
+    if (m_Intermediate2 && m_Intermediate2->pBlendingParams)
     {
-        MOS_FreeMemory(m_Intermediate2.pBlendingParams);
-        m_Intermediate2.pBlendingParams = nullptr;
+        MOS_FreeMemory(m_Intermediate2->pBlendingParams);
+        m_Intermediate2->pBlendingParams = nullptr;
     }
 
     if (pOsInterface)
     {
-        pOsInterface->pfnFreeResource(
-            pOsInterface,
-            &m_Intermediate.OsResource);
-
-        pOsInterface->pfnFreeResource(
-            pOsInterface,
-            &m_Intermediate1.OsResource);
-
-        pOsInterface->pfnFreeResource(
-            pOsInterface,
-            &m_Intermediate2.OsResource);
+        if (m_Intermediate)
+        {
+            pOsInterface->pfnFreeResource(
+                pOsInterface,
+                &m_Intermediate->OsResource);
+        }
+        if (m_Intermediate1)
+        {
+            pOsInterface->pfnFreeResource(
+                pOsInterface,
+                &m_Intermediate1->OsResource);
+        }
+        if (m_Intermediate2)
+        {
+            pOsInterface->pfnFreeResource(
+                pOsInterface,
+                &m_Intermediate2->OsResource);
+        }
 
         pOsInterface->pfnFreeResource(
             pOsInterface,
@@ -7542,9 +7575,9 @@
     MOS_ZeroMemory(&m_SearchFilter, sizeof(m_SearchFilter));
     MOS_ZeroMemory(&m_KernelSearch, sizeof(m_KernelSearch));
     MOS_ZeroMemory(&m_KernelParams, sizeof(m_KernelParams));
-    MOS_ZeroMemory(&m_Intermediate, sizeof(m_Intermediate));
-    MOS_ZeroMemory(&m_Intermediate1, sizeof(m_Intermediate1));
-    MOS_ZeroMemory(&m_Intermediate2, sizeof(m_Intermediate2));
+    MOS_ZeroMemory(&m_IntermediateSurface, sizeof(m_IntermediateSurface));
+    MOS_ZeroMemory(&m_IntermediateSurface1, sizeof(m_IntermediateSurface1));
+    MOS_ZeroMemory(&m_IntermediateSurface2, sizeof(m_IntermediateSurface2));
     MOS_ZeroMemory(&m_CmfcCoeff, sizeof(m_CmfcCoeff));
     MOS_ZeroMemory(&m_RenderHalCmfcCoeff, sizeof(m_RenderHalCmfcCoeff));
     MOS_ZeroMemory(&m_AvsParameters, sizeof(m_AvsParameters));
@@ -7580,8 +7613,18 @@
 
     VPHAL_RENDER_CHK_NULL(pOsInterface);
     // Reset Intermediate output surface (multiple phase)
-    pOsInterface->pfnResetResourceAllocationIndex(pOsInterface, &m_Intermediate.OsResource);
-    pOsInterface->pfnResetResourceAllocationIndex(pOsInterface, &m_Intermediate1.OsResource);
+    if (m_Intermediate)
+    {
+        pOsInterface->pfnResetResourceAllocationIndex(pOsInterface, &m_Intermediate->OsResource);
+    }
+    if (m_Intermediate1)
+    {
+        pOsInterface->pfnResetResourceAllocationIndex(pOsInterface, &m_Intermediate1->OsResource);
+    }
+    if (m_Intermediate2)
+    {
+        pOsInterface->pfnResetResourceAllocationIndex(pOsInterface, &m_Intermediate2->OsResource);
+    }
 
     ReadUserSetting(
         m_userSettingPtr,
diff --git a/media_driver/agnostic/common/vp/hal/vphal_render_composite.h b/media_driver/agnostic/common/vp/hal/vphal_render_composite.h
index 3838e89..981d6c3 100644
--- a/media_driver/agnostic/common/vp/hal/vphal_render_composite.h
+++ b/media_driver/agnostic/common/vp/hal/vphal_render_composite.h
@@ -1158,6 +1158,9 @@
     //!
     virtual MOS_STATUS GetIntermediateOutput(PVPHAL_SURFACE &output);
 
+    virtual PVPHAL_SURFACE GetIntermediateSurface();
+    virtual PVPHAL_SURFACE GetIntermediate1Surface();
+    virtual PVPHAL_SURFACE GetIntermediate2Surface();
     // Procamp
     int32_t                         m_iMaxProcampEntries;
     int32_t                         m_iProcampVersion;
@@ -1224,9 +1227,12 @@
 
     static const int                AVS_CACHE_SIZE = 4;           //!< AVS coefficients cache size
     AvsCoeffsCache<AVS_CACHE_SIZE>  m_AvsCoeffsCache;             //!< AVS coefficients calculation is expensive, add cache to mitigate
-    VPHAL_SURFACE                   m_Intermediate  = {};         //!< Intermediate surface (multiple phase / constriction support)
-    VPHAL_SURFACE                   m_Intermediate1 = {};         //!< Intermediate surface (multiple phase / constriction support)
-    VPHAL_SURFACE                   m_Intermediate2 = {};         //!< Rotation output intermediate surface
+    VPHAL_SURFACE                   m_IntermediateSurface  = {};  //!< Intermediate surface (multiple phase / constriction support)
+    VPHAL_SURFACE                   m_IntermediateSurface1 = {};  //!< Intermediate surface (multiple phase / constriction support)
+    VPHAL_SURFACE                   *m_Intermediate  = nullptr;   //!< Intermediate surface (multiple phase / constriction support)
+    VPHAL_SURFACE                   *m_Intermediate1 = nullptr;   //!< Intermediate surface (multiple phase / constriction support)
+    VPHAL_SURFACE                   *m_Intermediate2 = nullptr;   //!< Rotation output intermediate surface
+    VPHAL_SURFACE                   m_IntermediateSurface2 = {};  //!< Rotation output intermediate surface
     
     VPHAL_SURFACE                   m_AuxiliarySyncSurface = {};  //!< This Auxiliary surface is used to sync engine workload
 
diff --git a/media_driver/agnostic/gen11/codec/hal/codechal_encode_hevc_g11.cpp b/media_driver/agnostic/gen11/codec/hal/codechal_encode_hevc_g11.cpp
index 771125e..d29063c 100644
--- a/media_driver/agnostic/gen11/codec/hal/codechal_encode_hevc_g11.cpp
+++ b/media_driver/agnostic/gen11/codec/hal/codechal_encode_hevc_g11.cpp
@@ -8447,7 +8447,7 @@
 
 MOS_STATUS CodechalEncHevcStateG11::SubmitCommandBuffer(
     PMOS_COMMAND_BUFFER cmdBuffer,
-    bool                nullRendering)
+    bool                bNullRendering)
 {
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
 
@@ -8462,7 +8462,7 @@
         {
             CODECHAL_ENCODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(cmdBuffer));
         }
-        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, nullRendering));
+        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, bNullRendering));
         return eStatus;
     }
 
@@ -8504,7 +8504,7 @@
     if(eStatus == MOS_STATUS_SUCCESS)
     {
         CODECHAL_ENCODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(&m_realCmdBuffer));
-        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, nullRendering));
+        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, bNullRendering));
     }
 
     return eStatus;
diff --git a/media_driver/agnostic/gen11/codec/hal/codechal_encode_hevc_g11.h b/media_driver/agnostic/gen11/codec/hal/codechal_encode_hevc_g11.h
index 57a2de5..fcd9741 100644
--- a/media_driver/agnostic/gen11/codec/hal/codechal_encode_hevc_g11.h
+++ b/media_driver/agnostic/gen11/codec/hal/codechal_encode_hevc_g11.h
@@ -1422,7 +1422,7 @@
 
     MOS_STATUS SubmitCommandBuffer(
         PMOS_COMMAND_BUFFER cmdBuffer,
-        bool  nullRendering);
+        bool  bNullRendering);
 
     MOS_STATUS SendPrologWithFrameTracking(
         PMOS_COMMAND_BUFFER         cmdBuffer,
diff --git a/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_hevc_g11.cpp b/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_hevc_g11.cpp
index 5a960ea..1a04f9c 100644
--- a/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_hevc_g11.cpp
+++ b/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_hevc_g11.cpp
@@ -5519,7 +5519,7 @@
 
 MOS_STATUS CodechalVdencHevcStateG11::SubmitCommandBuffer(
     PMOS_COMMAND_BUFFER cmdBuffer,
-    bool                nullRendering)
+    bool                bNullRendering)
 {
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
 
@@ -5534,7 +5534,7 @@
         {
             CODECHAL_ENCODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(cmdBuffer));
         }
-        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, nullRendering));
+        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, bNullRendering));
         return eStatus;
     }
 
@@ -5560,7 +5560,7 @@
 
     if (m_osInterface->phasedSubmission)
     {
-        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, nullRendering));
+        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, bNullRendering));
     }
     else
     {
@@ -5583,7 +5583,7 @@
         if(eStatus == MOS_STATUS_SUCCESS)
         {
             CODECHAL_ENCODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(&m_realCmdBuffer));
-            CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, nullRendering));
+            CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, bNullRendering));
         }
     }
 
diff --git a/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_hevc_g11.h b/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_hevc_g11.h
index e19c192..4d9ede0 100644
--- a/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_hevc_g11.h
+++ b/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_hevc_g11.h
@@ -2270,7 +2270,7 @@
 
     MOS_STATUS SubmitCommandBuffer(
         PMOS_COMMAND_BUFFER cmdBuffer,
-        bool  nullRendering);
+        bool  bNullRendering);
 
     MOS_STATUS SendPrologWithFrameTracking(
         PMOS_COMMAND_BUFFER         cmdBuffer,
diff --git a/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_vp9_g11.cpp b/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_vp9_g11.cpp
index 7c34a8c..7629ce5 100644
--- a/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_vp9_g11.cpp
+++ b/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_vp9_g11.cpp
@@ -2705,7 +2705,7 @@
 
 MOS_STATUS CodechalVdencVp9StateG11::SubmitCommandBuffer(
     PMOS_COMMAND_BUFFER cmdBuffer,
-    bool nullRendering)
+    bool bNullRendering)
 {
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
 
@@ -2719,14 +2719,14 @@
         {
             CODECHAL_ENCODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(cmdBuffer));
         }
-        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, nullRendering));
+        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, bNullRendering));
     }
     else // virtual engine
     {
         if (m_osInterface->phasedSubmission)
         {
             CodecHalEncodeScalability_EncodePhaseToSubmissionType(IsFirstPipe(),&m_realCmdBuffer);
-            CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, nullRendering));
+            CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, bNullRendering));
         }
         else
         {
@@ -2752,7 +2752,7 @@
             if (eStatus == MOS_STATUS_SUCCESS)
             {
                 CODECHAL_ENCODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(&m_realCmdBuffer));
-                CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, nullRendering));
+                CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, bNullRendering));
             }
         }
     }
diff --git a/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_vp9_g11.h b/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_vp9_g11.h
index 7c92fa7..177a4d7 100644
--- a/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_vp9_g11.h
+++ b/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_vp9_g11.h
@@ -1047,7 +1047,7 @@
 
     MOS_STATUS SubmitCommandBuffer(
         PMOS_COMMAND_BUFFER cmdBuffer,
-        bool nullRendering) override;
+        bool bNullRendering) override;
 
     MOS_STATUS SetMeCurbeParams(
         MeCurbeParams* meParams);
diff --git a/media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_vdenc_g11_X.h b/media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_vdenc_g11_X.h
index e1a1117..1d7692a 100644
--- a/media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_vdenc_g11_X.h
+++ b/media_driver/agnostic/gen11/hw/vdbox/mhw_vdbox_vdenc_g11_X.h
@@ -210,7 +210,7 @@
     //!
     //! \brief  Constructor
     //!
-    MhwVdboxVdencInterfaceG11<TVdencCmds>(PMOS_INTERFACE osInterface) : MhwVdboxVdencInterfaceGeneric<TVdencCmds>(osInterface)
+    MhwVdboxVdencInterfaceG11(PMOS_INTERFACE osInterface) : MhwVdboxVdencInterfaceGeneric<TVdencCmds>(osInterface)
     {
         MHW_FUNCTION_ENTER;
 
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_decode_avc_g12.cpp b/media_driver/agnostic/gen12/codec/hal/codechal_decode_avc_g12.cpp
index 47af3e3..a9fdabb 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_decode_avc_g12.cpp
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_decode_avc_g12.cpp
@@ -452,7 +452,7 @@
         CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
             &cmdBuffer,
             CODECHAL_NUM_MEDIA_STATES,
-            "_DEC"));
+            "_AVC_DECODE_0"));
 
     //CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHal_DbgReplaceAllCommands(
     //    m_debugInterface,
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_decode_hevc_g12.cpp b/media_driver/agnostic/gen12/codec/hal/codechal_decode_hevc_g12.cpp
index 898413f..829de3f 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_decode_hevc_g12.cpp
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_decode_hevc_g12.cpp
@@ -2189,10 +2189,19 @@
             }
             else
             {
+                std::string packetName = "";
+                if (m_shortFormatInUse)
+                {
+                    packetName = "_S2L_DECODE_PASS0__0";
+                }
+                else
+                {
+                    packetName = "_DEC";
+                }
                 CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
                     &primCmdBuffer,
                     CODECHAL_NUM_MEDIA_STATES,
-                    "_DEC"));
+                    packetName.c_str()));
             }
         });
 
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_decode_jpeg_g12.cpp b/media_driver/agnostic/gen12/codec/hal/codechal_decode_jpeg_g12.cpp
index 62c9e1f..564cd51 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_decode_jpeg_g12.cpp
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_decode_jpeg_g12.cpp
@@ -511,7 +511,7 @@
         CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
             &cmdBuffer,
             CODECHAL_NUM_MEDIA_STATES,
-            "_DEC"));
+            "_JPEG_DECODE_0"));
     )
 
     if (m_copiedDataBufferInUse)
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_encode_avc_g12.cpp b/media_driver/agnostic/gen12/codec/hal/codechal_encode_avc_g12.cpp
index 8500afd..d66a450 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_encode_avc_g12.cpp
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_encode_avc_g12.cpp
@@ -1762,7 +1762,7 @@
 
 MOS_STATUS CodechalEncodeAvcEncG12::SubmitCommandBuffer(
     PMOS_COMMAND_BUFFER cmdBuffer,
-    int32_t             nullRendering)
+    bool             bNullRendering)
 {
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
 
@@ -1771,7 +1771,7 @@
     CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
 
     CODECHAL_ENCODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(cmdBuffer));
-    CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, nullRendering));
+    CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, bNullRendering));
     return eStatus;
 }
 
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_encode_avc_g12.h b/media_driver/agnostic/gen12/codec/hal/codechal_encode_avc_g12.h
index 54b83bf..01f5a28 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_encode_avc_g12.h
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_encode_avc_g12.h
@@ -106,7 +106,7 @@
 
     MOS_STATUS SubmitCommandBuffer(
         PMOS_COMMAND_BUFFER cmdBuffer,
-        int32_t  nullRendering) override;
+        bool  bNullRendering) override;
 
     MOS_STATUS ExecuteKernelFunctions() override;
 
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_encode_csc_ds_g12.cpp b/media_driver/agnostic/gen12/codec/hal/codechal_encode_csc_ds_g12.cpp
index 91f4c15..15a471f 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_encode_csc_ds_g12.cpp
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_encode_csc_ds_g12.cpp
@@ -96,6 +96,7 @@
         m_cscRequireConvTo8bPlanar = (uint8_t)HCP_CHROMA_FORMAT_YUV422 == m_outputChromaFormat;
         break;
     case Format_A8R8G8B8:
+    case Format_X8R8G8B8:
         m_colorRawSurface = cscColorARGB;
         m_cscUsingSfc = IsSfcEnabled() ? 1 : 0;
         m_cscRequireColor = 1;
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_encode_hevc_g12.cpp b/media_driver/agnostic/gen12/codec/hal/codechal_encode_hevc_g12.cpp
index 0d89ed4..38ac70e 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_encode_hevc_g12.cpp
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_encode_hevc_g12.cpp
@@ -144,8 +144,40 @@
     CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hcpInterface->AddHcpSurfaceCmd(cmdBuffer, &reconSurfaceParams));
 
     // Add the surface state for reference picture, GEN12 HW change
-    reconSurfaceParams.ucSurfaceStateId = CODECHAL_HCP_REF_SURFACE_ID;
-    CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hcpInterface->AddHcpSurfaceCmd(cmdBuffer, &reconSurfaceParams));
+    MHW_VDBOX_SURFACE_PARAMS refSurfaceParams;
+    SetHcpRefSurfaceParams(refSurfaceParams);
+
+    if (m_mmcState->IsMmcEnabled())
+    {
+        refSurfaceParams.refsMmcEnable       = 0;
+        refSurfaceParams.refsMmcType         = 0;
+        refSurfaceParams.dwCompressionFormat = 0;
+
+        //add for B frame support
+        if (m_pictureCodingType != I_TYPE)
+        {
+            for (uint8_t i = 0; i < CODEC_MAX_NUM_REF_FRAME_HEVC; i++)
+            {
+                if (i < CODEC_MAX_NUM_REF_FRAME_HEVC &&
+                    m_picIdx[i].bValid && m_currUsedRefPic[i])
+                {
+                    uint8_t idx          = m_picIdx[i].ucPicIdx;
+                    uint8_t frameStoreId = m_refIdxMapping[i];
+
+                    MOS_MEMCOMP_STATE mmcState = MOS_MEMCOMP_DISABLED;
+                    ENCODE_CHK_STATUS_RETURN(m_mmcState->GetSurfaceMmcState(const_cast<PMOS_SURFACE>(&m_refList[idx]->sRefReconBuffer), &mmcState));
+                    refSurfaceParams.refsMmcEnable |= (mmcState == MOS_MEMCOMP_RC || mmcState == MOS_MEMCOMP_MC) ? (1 << frameStoreId) : 0;
+                    refSurfaceParams.refsMmcType |= (mmcState == MOS_MEMCOMP_RC) ? (1 << frameStoreId) : 0;
+                    if (mmcState == MOS_MEMCOMP_RC || mmcState == MOS_MEMCOMP_MC)
+                    {
+                        ENCODE_CHK_STATUS_RETURN(m_mmcState->GetSurfaceMmcFormat(const_cast<PMOS_SURFACE>(&m_refList[idx]->sRefReconBuffer), &refSurfaceParams.dwCompressionFormat));
+                    }
+                }
+            }
+        }
+    }
+
+    CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hcpInterface->AddHcpSurfaceCmd(cmdBuffer, &refSurfaceParams));
 
     return eStatus;
 }
@@ -9790,7 +9822,7 @@
 
 MOS_STATUS CodechalEncHevcStateG12::SubmitCommandBuffer(
     PMOS_COMMAND_BUFFER cmdBuffer,
-    bool                nullRendering)
+    bool                bNullRendering)
 {
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
 
@@ -9806,7 +9838,7 @@
             CODECHAL_ENCODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(cmdBuffer));
         }
 
-        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, nullRendering));
+        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, bNullRendering));
         return eStatus;
     }
 
@@ -9848,7 +9880,7 @@
     if (eStatus == MOS_STATUS_SUCCESS)
     {
         CODECHAL_ENCODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(&m_realCmdBuffer));
-        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, nullRendering));
+        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, bNullRendering));
     }
 
     return eStatus;
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_encode_hevc_g12.h b/media_driver/agnostic/gen12/codec/hal/codechal_encode_hevc_g12.h
index 725c1be..5656dbf 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_encode_hevc_g12.h
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_encode_hevc_g12.h
@@ -1475,7 +1475,7 @@
 
     MOS_STATUS SubmitCommandBuffer(
         PMOS_COMMAND_BUFFER cmdBuffer,
-        bool  nullRendering) override;
+        bool  bNullRendering) override;
 
     MOS_STATUS SetSliceStructs() override;
 
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_encode_jpeg_g12.cpp b/media_driver/agnostic/gen12/codec/hal/codechal_encode_jpeg_g12.cpp
index 026dc5a..b28759a 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_encode_jpeg_g12.cpp
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_encode_jpeg_g12.cpp
@@ -122,7 +122,7 @@
 
 MOS_STATUS CodechalEncodeJpegStateG12::SubmitCommandBuffer(
     PMOS_COMMAND_BUFFER cmdBuffer,
-    int32_t             bNullRendering)
+    bool             bNullRendering)
 {
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
 
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_encode_jpeg_g12.h b/media_driver/agnostic/gen12/codec/hal/codechal_encode_jpeg_g12.h
index 49b9b0a..a30d946 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_encode_jpeg_g12.h
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_encode_jpeg_g12.h
@@ -73,7 +73,7 @@
 
     MOS_STATUS SubmitCommandBuffer(
         PMOS_COMMAND_BUFFER cmdBuffer,
-        int32_t             bNullRendering) override;
+        bool             bNullRendering) override;
 
     //!
     //! \brief    Set And Populate VE Hint parameters
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_encode_mpeg2_g12.cpp b/media_driver/agnostic/gen12/codec/hal/codechal_encode_mpeg2_g12.cpp
index 84fc799..cb2c8a8 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_encode_mpeg2_g12.cpp
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_encode_mpeg2_g12.cpp
@@ -1110,7 +1110,7 @@
 
 MOS_STATUS CodechalEncodeMpeg2G12::SubmitCommandBuffer(
     PMOS_COMMAND_BUFFER cmdBuffer,
-    int32_t             bNullRendering)
+    bool             bNullRendering)
 {
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
 
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_encode_mpeg2_g12.h b/media_driver/agnostic/gen12/codec/hal/codechal_encode_mpeg2_g12.h
index fa15c85..d5bc93a 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_encode_mpeg2_g12.h
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_encode_mpeg2_g12.h
@@ -104,7 +104,7 @@
 
     MOS_STATUS SubmitCommandBuffer(
         PMOS_COMMAND_BUFFER cmdBuffer,
-        int32_t  nullRendering) override;
+        bool  bNullRendering) override;
 
 protected:
     MOS_STATUS EncodeMeKernel() override;
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_avc_g12.cpp b/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_avc_g12.cpp
index 0892a4f..f984013 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_avc_g12.cpp
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_avc_g12.cpp
@@ -1385,7 +1385,7 @@
 
 MOS_STATUS CodechalVdencAvcStateG12::SubmitCommandBuffer(
     PMOS_COMMAND_BUFFER cmdBuffer,
-    int32_t             nullRendering)
+    bool             bNullRendering)
 {
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
 
@@ -1395,7 +1395,7 @@
 
     HalOcaInterface::On1stLevelBBEnd(*cmdBuffer, *m_osInterface);
     CODECHAL_ENCODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(cmdBuffer));
-    CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, nullRendering));
+    CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, bNullRendering));
     return eStatus;
 }
 
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_avc_g12.h b/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_avc_g12.h
index 27a461c..3288b4e 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_avc_g12.h
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_avc_g12.h
@@ -99,7 +99,7 @@
 
     MOS_STATUS SubmitCommandBuffer(
         PMOS_COMMAND_BUFFER cmdBuffer,
-        int32_t             nullRendering) override;
+        bool             bNullRendering) override;
 
     MOS_STATUS InitKernelStateSFD() override;
 
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_hevc_g12.cpp b/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_hevc_g12.cpp
index b0a44fc..5483fc8 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_hevc_g12.cpp
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_hevc_g12.cpp
@@ -2886,6 +2886,7 @@
 
     MHW_VDBOX_SURFACE_PARAMS reconSurfaceParams{};
     SetHcpReconSurfaceParams(reconSurfaceParams);
+
 #ifdef _MMC_SUPPORTED
     // Recon P010v MMC state set from RC for compression write
     MOS_MEMCOMP_STATE tempMmcState = reconSurfaceParams.mmcState;
@@ -2894,26 +2895,54 @@
         reconSurfaceParams.mmcState = MOS_MEMCOMP_RC;
     }
 #endif
-    CODECHAL_ENCODE_CHK_STATUS_WITH_DESTROY_RETURN(m_hcpInterface->AddHcpSurfaceCmd(&cmdBuffer, &reconSurfaceParams), release_func);
+    CODECHAL_ENCODE_CHK_STATUS_WITH_DESTROY_RETURN(m_hcpInterface->AddHcpSurfaceCmd(&cmdBuffer, &reconSurfaceParams), release_func); //this is for Recon surf cmd set
+
+    MHW_VDBOX_SURFACE_PARAMS refSurfaceParams{};
+    SetHcpRefSurfaceParams(refSurfaceParams);  //it set MMC state and MMCFormat
 
     // Add the surface state for reference picture, GEN12 HW change
-    reconSurfaceParams.ucSurfaceStateId = CODECHAL_HCP_REF_SURFACE_ID;
     *m_pipeBufAddrParams = {};
-    SetHcpPipeBufAddrParams(*m_pipeBufAddrParams);
+    SetHcpPipeBufAddrParams(*m_pipeBufAddrParams); 
 
 #ifdef _MMC_SUPPORTED
-    // Reference P010v MMC state set from MC for compression read
-    if (m_reconSurface.Format == Format_P010 && MmcEnable(tempMmcState))
-    {
-        reconSurfaceParams.mmcState = tempMmcState;
-    }
     if (m_enableSCC && m_hevcPicParams->pps_curr_pic_ref_enabled_flag)
     {
-        reconSurfaceParams.mmcSkipMask = (1 << m_slotForRecNotFiltered);
+        refSurfaceParams.mmcSkipMask   = (1 << m_slotForRecNotFiltered); //add this for ref
     }
 #endif
 
-    CODECHAL_ENCODE_CHK_STATUS_WITH_DESTROY_RETURN(m_hcpInterface->AddHcpSurfaceCmd(&cmdBuffer, &reconSurfaceParams), release_func);
+    if (m_mmcState->IsMmcEnabled())
+    {
+       
+        refSurfaceParams.refsMmcEnable = 0;
+        refSurfaceParams.refsMmcType   = 0;
+        refSurfaceParams.dwCompressionFormat = 0;
+
+        //add for B frame support
+        if (m_pictureCodingType != I_TYPE)
+        {
+            for (uint8_t i = 0; i < CODEC_MAX_NUM_REF_FRAME_HEVC; i++)
+            {
+                if (i < CODEC_MAX_NUM_REF_FRAME_HEVC &&
+                    m_picIdx[i].bValid && m_currUsedRefPic[i])
+                {
+                    uint8_t idx          = m_picIdx[i].ucPicIdx;
+                    uint8_t frameStoreId = m_refIdxMapping[i];
+
+                    MOS_MEMCOMP_STATE mmcState  = MOS_MEMCOMP_DISABLED;
+                    ENCODE_CHK_STATUS_RETURN(m_mmcState->GetSurfaceMmcState(const_cast<PMOS_SURFACE>(&m_refList[idx]->sRefReconBuffer), &mmcState));
+                    refSurfaceParams.refsMmcEnable |= (mmcState == MOS_MEMCOMP_RC || mmcState == MOS_MEMCOMP_MC) ? (1 << frameStoreId) : 0;
+                    refSurfaceParams.refsMmcType |= (mmcState == MOS_MEMCOMP_RC) ? (1 << frameStoreId) : 0;
+                    if (mmcState == MOS_MEMCOMP_RC || mmcState == MOS_MEMCOMP_MC)
+                    {
+                        ENCODE_CHK_STATUS_RETURN(m_mmcState->GetSurfaceMmcFormat(const_cast<PMOS_SURFACE>(&m_refList[idx]->sRefReconBuffer), &refSurfaceParams.dwCompressionFormat));
+                    }
+                }
+            }
+        }
+    }
+
+    CODECHAL_ENCODE_CHK_STATUS_WITH_DESTROY_RETURN(m_hcpInterface->AddHcpSurfaceCmd(&cmdBuffer, &refSurfaceParams), release_func);
 
     CODECHAL_ENCODE_CHK_STATUS_WITH_DESTROY_RETURN(AddHcpPipeBufAddrCmd(&cmdBuffer), release_func);
 
@@ -2930,9 +2959,9 @@
     CODECHAL_ENCODE_CHK_STATUS_WITH_DESTROY_RETURN(m_vdencInterface->AddVdencPipeModeSelectCmd(&cmdBuffer, pipeModeSelectParams), release_func);
 
     MHW_VDBOX_SURFACE_PARAMS dsSurfaceParams[2] = {};
-    SetVdencSurfaceStateParams(srcSurfaceParams, reconSurfaceParams, dsSurfaceParams[0], dsSurfaceParams[1]);
+    SetVdencSurfaceStateParams(srcSurfaceParams, refSurfaceParams, dsSurfaceParams[0], dsSurfaceParams[1]);
     CODECHAL_ENCODE_CHK_STATUS_WITH_DESTROY_RETURN(m_vdencInterface->AddVdencSrcSurfaceStateCmd(&cmdBuffer, &srcSurfaceParams), release_func);
-    CODECHAL_ENCODE_CHK_STATUS_WITH_DESTROY_RETURN(m_vdencInterface->AddVdencRefSurfaceStateCmd(&cmdBuffer, &reconSurfaceParams), release_func);
+    CODECHAL_ENCODE_CHK_STATUS_WITH_DESTROY_RETURN(m_vdencInterface->AddVdencRefSurfaceStateCmd(&cmdBuffer, &refSurfaceParams), release_func);  //  this is for Ref, no mmc related setting
     CODECHAL_ENCODE_CHK_STATUS_WITH_DESTROY_RETURN(m_vdencInterface->AddVdencDsRefSurfaceStateCmd(&cmdBuffer, &dsSurfaceParams[0], 2), release_func);
 
     SetVdencPipeBufAddrParams(*m_pipeBufAddrParams);
@@ -5343,6 +5372,12 @@
 
     CodechalEncodeHevcBase::SetHcpPipeBufAddrParams(pipeBufAddrParams);
 
+    //set MMC flag
+    if (m_mmcState->IsMmcEnabled())
+    {
+        pipeBufAddrParams.bMmcEnabled = true;
+    }
+
     PCODECHAL_ENCODE_BUFFER tileStatisticsBuffer = &m_resTileBasedStatisticsBuffer[m_virtualEngineBbIndex];
     if (!Mos_ResourceIsNull(&tileStatisticsBuffer->sResource) && (m_numPipe > 1))
     {
@@ -7696,7 +7731,7 @@
 
 MOS_STATUS CodechalVdencHevcStateG12::SubmitCommandBuffer(
     PMOS_COMMAND_BUFFER cmdBuffer,
-    bool                nullRendering)
+    bool                bNullRendering)
 {
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
 
@@ -7716,7 +7751,7 @@
         {
             CODECHAL_ENCODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(cmdBuffer));
         }
-        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, nullRendering));
+        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, bNullRendering));
         return eStatus;
     }
 
@@ -7742,7 +7777,7 @@
 
     if (m_osInterface->phasedSubmission)
     {
-        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, nullRendering));
+        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, bNullRendering));
     }
     else
     {
@@ -7765,7 +7800,7 @@
         if(eStatus == MOS_STATUS_SUCCESS)
         {
             CODECHAL_ENCODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(&m_realCmdBuffer));
-            CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, nullRendering));
+            CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, bNullRendering));
         }
     }
 
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_hevc_g12.h b/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_hevc_g12.h
index eefdfa8..041d7d1 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_hevc_g12.h
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_hevc_g12.h
@@ -2413,7 +2413,7 @@
 
     MOS_STATUS SubmitCommandBuffer(
         PMOS_COMMAND_BUFFER cmdBuffer,
-        bool  nullRendering) override;
+        bool  bNullRendering) override;
 
     MOS_STATUS SendPrologWithFrameTracking(
         PMOS_COMMAND_BUFFER         cmdBuffer,
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_vp9_g12.cpp b/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_vp9_g12.cpp
index dcfc56b..ece65d3 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_vp9_g12.cpp
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_vp9_g12.cpp
@@ -3127,7 +3127,7 @@
 
 MOS_STATUS CodechalVdencVp9StateG12::SubmitCommandBuffer(
     PMOS_COMMAND_BUFFER cmdBuffer,
-    bool nullRendering)
+    bool bNullRendering)
 {
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
 
@@ -3141,7 +3141,7 @@
         {
             CODECHAL_ENCODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(cmdBuffer));
         }
-        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, nullRendering));
+        CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBuffer, bNullRendering));
     }
     else // virtual engine
     {
@@ -3152,7 +3152,7 @@
 
         if (m_osInterface->phasedSubmission)
         {
-            CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, nullRendering));
+            CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, bNullRendering));
         }
         else
         {
@@ -3174,7 +3174,7 @@
             if (eStatus == MOS_STATUS_SUCCESS)
             {
                 CODECHAL_ENCODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(&m_realCmdBuffer));
-                CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, nullRendering));
+                CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &m_realCmdBuffer, bNullRendering));
             }
         }
     }
diff --git a/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_vp9_g12.h b/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_vp9_g12.h
index 4eab6f8..1633c45 100644
--- a/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_vp9_g12.h
+++ b/media_driver/agnostic/gen12/codec/hal/codechal_vdenc_vp9_g12.h
@@ -1161,7 +1161,7 @@
 
     MOS_STATUS SubmitCommandBuffer(
         PMOS_COMMAND_BUFFER cmdBuffer,
-        bool nullRendering) override;
+        bool bNullRendering) override;
 
     MOS_STATUS SendPrologWithFrameTracking(
         PMOS_COMMAND_BUFFER cmdBuffer,
diff --git a/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_hcp_g12_X.cpp b/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_hcp_g12_X.cpp
index e15fa8a..2028af5 100644
--- a/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_hcp_g12_X.cpp
+++ b/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_hcp_g12_X.cpp
@@ -1721,8 +1721,16 @@
         cmd->DW3.YOffsetForVCr = params->dwReconSurfHeight;
     }
 
-    cmd->DW4.MemoryCompressionEnable = MmcEnable(params->mmcState) ? ((~params->mmcSkipMask) & 0xff) : 0;
-    cmd->DW4.CompressionType         = MmcIsRc(params->mmcState) ? 0xff : 0;
+    if (params->ucSurfaceStateId == CODECHAL_HCP_REF_SURFACE_ID && params->Mode == CODECHAL_ENCODE_MODE_HEVC)
+    {
+        cmd->DW4.MemoryCompressionEnable = params->refsMmcEnable ? ((~params->mmcSkipMask) & 0xff) : 0;
+        cmd->DW4.CompressionType = params->refsMmcType;
+    }
+    else
+    {
+        cmd->DW4.MemoryCompressionEnable = MmcEnable(params->mmcState) ? ((~params->mmcSkipMask) & 0xff) : 0;
+        cmd->DW4.CompressionType         = MmcIsRc(params->mmcState) ? 0xff : 0;
+    }
 
     return eStatus;
 }
diff --git a/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_vdenc_g12_X.h b/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_vdenc_g12_X.h
index 0311ea3..3ffbf0f 100644
--- a/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_vdenc_g12_X.h
+++ b/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_vdenc_g12_X.h
@@ -904,8 +904,24 @@
                     break;
                 }
 
-                mmcMode = (params->PostDeblockSurfMmcState != MOS_MEMCOMP_DISABLED) ?
-                    params->PostDeblockSurfMmcState : params->PreDeblockSurfMmcState;
+                if (params->Mode == CODECHAL_ENCODE_MODE_HEVC)
+                {
+                    if (params->bMmcEnabled)
+                    {
+                        MHW_MI_CHK_STATUS(this->m_osInterface->pfnGetMemoryCompressionMode(
+                        this->m_osInterface, params->presVdencReferences[refIdx], &mmcMode));
+                    }
+                    else
+                    {
+                        mmcMode = MOS_MEMCOMP_DISABLED;
+                    }
+                }
+                else
+                {
+                    mmcMode = (params->PostDeblockSurfMmcState != MOS_MEMCOMP_DISABLED) ?
+                        params->PostDeblockSurfMmcState : params->PreDeblockSurfMmcState;                    
+                } 
+
                 switch (refIdx)
                 {
                 case 0:
@@ -1117,8 +1133,23 @@
                 resourceParams.bIsWritable = false;
                 resourceParams.pdwCmd = (uint32_t*)&(cmd.BwdRef0.LowerAddress);
 
-                mmcMode = (params->PostDeblockSurfMmcState != MOS_MEMCOMP_DISABLED) ?
-                    params->PostDeblockSurfMmcState : params->PreDeblockSurfMmcState;
+                if (params->Mode == CODECHAL_ENCODE_MODE_HEVC)
+                {
+                    if (params->bMmcEnabled)
+                    {
+                        MHW_MI_CHK_STATUS(this->m_osInterface->pfnGetMemoryCompressionMode(
+                        this->m_osInterface, params->presVdencReferences[refIdx], &mmcMode));
+                    }
+                    else
+                    {
+                        mmcMode = MOS_MEMCOMP_DISABLED;
+                    }
+                }
+                else
+                {
+                    mmcMode = (params->PostDeblockSurfMmcState != MOS_MEMCOMP_DISABLED) ?
+                        params->PostDeblockSurfMmcState : params->PreDeblockSurfMmcState;                    
+                } 
 
                 cmd.BwdRef0.PictureFields.DW0.MemoryCompressionEnable = MmcEnable(mmcMode) ? 1 : 0;
                 cmd.BwdRef0.PictureFields.DW0.CompressionType         = MmcIsRc(mmcMode) ? 1 : 0;
diff --git a/media_driver/agnostic/gen12/vp/hal/vphal_render_vebox_memdecomp_g12.cpp b/media_driver/agnostic/gen12/vp/hal/vphal_render_vebox_memdecomp_g12.cpp
index f5c6e64..8293b24 100644
--- a/media_driver/agnostic/gen12/vp/hal/vphal_render_vebox_memdecomp_g12.cpp
+++ b/media_driver/agnostic/gen12/vp/hal/vphal_render_vebox_memdecomp_g12.cpp
@@ -430,7 +430,7 @@
     ResourceParams.bIsWritable     = true;
     ResourceParams.dwOffset        =
         (outputSurface != nullptr ? outputSurface->dwOffset : inputSurface->dwOffset) + veboxOutputSurfCtrlBits.DW0.Value;
-    m_veboxInterface->pfnAddResourceToCmd(m_osInterface, cmdBuffer, &ResourceParams);
+    VPHAL_MEMORY_DECOMP_CHK_STATUS_RETURN(m_veboxInterface->pfnAddResourceToCmd(m_osInterface, cmdBuffer, &ResourceParams));
 
     m_osInterface->pfnAddCommand(cmdBuffer, &cmd, cmd.byteSize);
 
diff --git a/media_driver/agnostic/gen8/hw/vdbox/mhw_vdbox_mfx_g8_X.h b/media_driver/agnostic/gen8/hw/vdbox/mhw_vdbox_mfx_g8_X.h
index 00a0b7e..8b31c75 100644
--- a/media_driver/agnostic/gen8/hw/vdbox/mhw_vdbox_mfx_g8_X.h
+++ b/media_driver/agnostic/gen8/hw/vdbox/mhw_vdbox_mfx_g8_X.h
@@ -105,7 +105,7 @@
     //!
     //! \brief  Constructor
     //!
-    MhwVdboxMfxInterfaceG8<TMfxCmds>(
+    MhwVdboxMfxInterfaceG8(
         PMOS_INTERFACE osInterface,
         MhwMiInterface *miInterface,
         MhwCpInterface *cpInterface,
diff --git a/media_driver/agnostic/gen9/hw/vdbox/mhw_vdbox_hcp_g9_X.h b/media_driver/agnostic/gen9/hw/vdbox/mhw_vdbox_hcp_g9_X.h
index 481dc78..3a97379 100644
--- a/media_driver/agnostic/gen9/hw/vdbox/mhw_vdbox_hcp_g9_X.h
+++ b/media_driver/agnostic/gen9/hw/vdbox/mhw_vdbox_hcp_g9_X.h
@@ -120,7 +120,7 @@
     //!
     //! \brief  Constructor
     //!
-    MhwVdboxHcpInterfaceG9<THcpCmds>(
+    MhwVdboxHcpInterfaceG9(
         PMOS_INTERFACE osInterface,
         MhwMiInterface *miInterface,
         MhwCpInterface *cpInterface,
diff --git a/media_driver/agnostic/gen9/hw/vdbox/mhw_vdbox_mfx_g9_X.h b/media_driver/agnostic/gen9/hw/vdbox/mhw_vdbox_mfx_g9_X.h
index 22cc9cb..f57e23c 100644
--- a/media_driver/agnostic/gen9/hw/vdbox/mhw_vdbox_mfx_g9_X.h
+++ b/media_driver/agnostic/gen9/hw/vdbox/mhw_vdbox_mfx_g9_X.h
@@ -86,7 +86,7 @@
     //!
     //! \brief  Constructor
     //!
-    MhwVdboxMfxInterfaceG9<TMfxCmds>(
+    MhwVdboxMfxInterfaceG9(
         PMOS_INTERFACE osInterface,
         MhwMiInterface *miInterface,
         MhwCpInterface *cpInterface,
diff --git a/media_driver/agnostic/gen9/hw/vdbox/mhw_vdbox_vdenc_g9_X.h b/media_driver/agnostic/gen9/hw/vdbox/mhw_vdbox_vdenc_g9_X.h
index ef70366..951cab1 100644
--- a/media_driver/agnostic/gen9/hw/vdbox/mhw_vdbox_vdenc_g9_X.h
+++ b/media_driver/agnostic/gen9/hw/vdbox/mhw_vdbox_vdenc_g9_X.h
@@ -51,7 +51,7 @@
     //!
     //! \brief  Constructor
     //!
-    MhwVdboxVdencInterfaceG9<TVdencCmds>(PMOS_INTERFACE osInterface) : MhwVdboxVdencInterfaceGeneric<TVdencCmds>(osInterface)
+    MhwVdboxVdencInterfaceG9(PMOS_INTERFACE osInterface) : MhwVdboxVdencInterfaceGeneric<TVdencCmds>(osInterface)
     {
         MHW_FUNCTION_ENTER;
 
diff --git a/media_driver/cmake/linux/media_feature_flags_linux.cmake b/media_driver/cmake/linux/media_feature_flags_linux.cmake
index 3bea18f..8078475 100644
--- a/media_driver/cmake/linux/media_feature_flags_linux.cmake
+++ b/media_driver/cmake/linux/media_feature_flags_linux.cmake
@@ -18,7 +18,7 @@
 # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 # OTHER DEALINGS IN THE SOFTWARE.
 
-option (ENABLE_NEW_KMD "Enable NEW Linux KMD header files" ON)
+option (ENABLE_XE_KMD "Enable Linux Xe KMD header files" ON)
 
 # global flag for encode AVC_VME/HEVC_VME/MPEG2/VP8
 bs_set_if_undefined(Encode_VME_Supported "yes")
diff --git a/media_driver/linux/Xe_M/ddi/media_sysinfo_xe.cpp b/media_driver/linux/Xe_M/ddi/media_sysinfo_xe.cpp
index 7ff3527..4d51203 100644
--- a/media_driver/linux/Xe_M/ddi/media_sysinfo_xe.cpp
+++ b/media_driver/linux/Xe_M/ddi/media_sysinfo_xe.cpp
@@ -482,3 +482,13 @@
 
 static bool dg2Gt4Device56C1 = DeviceInfoFactory<GfxDeviceInfo>::
     RegisterDevice(0x56C1, &dg2Gt4Info);
+
+static bool dg2Gt4Device56C2 = DeviceInfoFactory<GfxDeviceInfo>::
+    RegisterDevice(0x56C2, &dg2Gt4Info);
+
+static bool dg2Gt4Device56BE = DeviceInfoFactory<GfxDeviceInfo>::
+    RegisterDevice(0x56BE, &dg2Gt4Info);
+
+static bool dg2Gt4Device56BF = DeviceInfoFactory<GfxDeviceInfo>::
+    RegisterDevice(0x56BF, &dg2Gt4Info);
+
diff --git a/media_driver/linux/common/codec/ddi/media_ddi_encode_avc.h b/media_driver/linux/common/codec/ddi/media_ddi_encode_avc.h
index 438bd01..289f4f0 100644
--- a/media_driver/linux/common/codec/ddi/media_ddi_encode_avc.h
+++ b/media_driver/linux/common/codec/ddi/media_ddi_encode_avc.h
@@ -527,6 +527,7 @@
     inline bool NeedDisplayFormatSwizzle(DDI_MEDIA_SURFACE *rawSurface)
     {
         if (Media_Format_A8R8G8B8 == rawSurface->format ||
+            Media_Format_X8R8G8B8 == rawSurface->format ||
             Media_Format_B10G10R10A2 == rawSurface->format)
         {
             return true;
diff --git a/media_driver/linux/common/codec/ddi/media_ddi_encode_hevc.h b/media_driver/linux/common/codec/ddi/media_ddi_encode_hevc.h
index 631218f..3cf3860 100644
--- a/media_driver/linux/common/codec/ddi/media_ddi_encode_hevc.h
+++ b/media_driver/linux/common/codec/ddi/media_ddi_encode_hevc.h
@@ -293,6 +293,7 @@
         bool ret = false;
 
         if (Media_Format_A8R8G8B8 == rawSurface->format ||
+           Media_Format_X8R8G8B8 == rawSurface->format  ||
            Media_Format_B10G10R10A2 == rawSurface->format)
         {
             ret = true;
@@ -300,6 +301,7 @@
 
         if (ret && 
             (Media_Format_A8R8G8B8 == reconSurface->format ||
+            Media_Format_X8R8G8B8 == reconSurface->format ||
             Media_Format_B10G10R10A2 == reconSurface->format))
         {
             ret = false;
diff --git a/media_driver/linux/common/ddi/media_libva.cpp b/media_driver/linux/common/ddi/media_libva.cpp
index 20e9f79..f52c6e6 100755
--- a/media_driver/linux/common/ddi/media_libva.cpp
+++ b/media_driver/linux/common/ddi/media_libva.cpp
@@ -2032,37 +2032,40 @@
     }
 
     //Caps need platform and sku table, especially in MediaLibvaCapsCp::IsDecEncryptionSupported
-    mediaCtx->m_caps = MediaLibvaCaps::CreateMediaLibvaCaps(mediaCtx);
-    if (!mediaCtx->m_caps)
-    {
-        DDI_ASSERTMESSAGE("Caps create failed. Not supported GFX device.");
-        DestroyMediaContextMutex(mediaCtx);
-        FreeForMediaContext(mediaCtx);
-        return VA_STATUS_ERROR_ALLOCATION_FAILED;
-    }
-
-    if (mediaCtx->m_caps->Init() != VA_STATUS_SUCCESS)
-    {
-        DDI_ASSERTMESSAGE("Caps init failed. Not supported GFX device.");
-        DdiMedia_CleanUp(mediaCtx);
-        DestroyMediaContextMutex(mediaCtx);
-        FreeForMediaContext(mediaCtx);
-        return VA_STATUS_ERROR_ALLOCATION_FAILED;
-    }
-    ctx->max_image_formats = mediaCtx->m_caps->GetImageFormatsMaxNum();
-
 #ifdef _MANUAL_SOFTLET_
     apoDdiEnabled = MediaLibvaApoDecision::InitDdiApoState(devicefd, mediaCtx->m_userSettingPtr);
-    if(apoDdiEnabled)
+    mediaCtx->m_apoDdiEnabled = apoDdiEnabled;
+    if(mediaCtx->m_apoDdiEnabled)
     {
         if (DdiMedia__InitializeSoftlet(mediaCtx, apoDdiEnabled) != VA_STATUS_SUCCESS)
         {
             DDI_ASSERTMESSAGE("Softlet initialize failed");
             return VA_STATUS_ERROR_ALLOCATION_FAILED;
         }
+        ctx->max_image_formats = mediaCtx->m_capsNext->GetImageFormatsMaxNum();
     }
-    mediaCtx->m_apoDdiEnabled = apoDdiEnabled;
+    else
 #endif
+    {
+        mediaCtx->m_caps = MediaLibvaCaps::CreateMediaLibvaCaps(mediaCtx);
+        if (!mediaCtx->m_caps)
+        {
+            DDI_ASSERTMESSAGE("Caps create failed. Not supported GFX device.");
+            DestroyMediaContextMutex(mediaCtx);
+            FreeForMediaContext(mediaCtx);
+            return VA_STATUS_ERROR_ALLOCATION_FAILED;
+        }
+
+        if (mediaCtx->m_caps->Init() != VA_STATUS_SUCCESS)
+        {
+            DDI_ASSERTMESSAGE("Caps init failed. Not supported GFX device.");
+            DdiMedia_CleanUp(mediaCtx);
+            DestroyMediaContextMutex(mediaCtx);
+            FreeForMediaContext(mediaCtx);
+            return VA_STATUS_ERROR_ALLOCATION_FAILED;
+        }
+        ctx->max_image_formats = mediaCtx->m_caps->GetImageFormatsMaxNum();
+    }
 
 #if !defined(ANDROID) && defined(X11_FOUND)
     DdiMediaUtil_InitMutex(&mediaCtx->PutSurfaceRenderMutex);
diff --git a/media_driver/linux/common/os/mos_graphicsresource_specific.cpp b/media_driver/linux/common/os/mos_graphicsresource_specific.cpp
index 26a6a8e..7779d6b 100755
--- a/media_driver/linux/common/os/mos_graphicsresource_specific.cpp
+++ b/media_driver/linux/common/os/mos_graphicsresource_specific.cpp
@@ -41,14 +41,6 @@
     MOS_OS_FUNCTION_ENTER;
 }
 
-MOS_STATUS GraphicsResourceSpecific::SetSyncTag(OsContext* osContextPtr, SyncParams& params, uint32_t streamIndex)
-{
-    MOS_UNUSED(osContextPtr);
-    MOS_UNUSED(params);
-    MOS_UNUSED(streamIndex);
-    return MOS_STATUS_SUCCESS;
-}
-
 bool GraphicsResourceSpecific::ResourceIsNull()
 {
     return ((m_bo == nullptr)
diff --git a/media_driver/linux/ult/libdrm_mock/mos_bufmgr_mock.c b/media_driver/linux/ult/libdrm_mock/mos_bufmgr_mock.c
index 5232f83..ad65c28 100644
--- a/media_driver/linux/ult/libdrm_mock/mos_bufmgr_mock.c
+++ b/media_driver/linux/ult/libdrm_mock/mos_bufmgr_mock.c
@@ -1364,15 +1364,19 @@
     }
 
     if (bo_gem->mem_virtual) {
-        VG(VALGRIND_FREELIKE_BLOCK(bo_gem->mem_virtual, 0));
+        VG(VALGRIND_MAKE_MEM_NOACCESS(bo_gem->mem_virtual, 0));
         drm_munmap(bo_gem->mem_virtual, bo_gem->bo.size);
+        bo_gem->mem_virtual = nullptr;
     }
     if (bo_gem->gtt_virtual) {
+        VG(VALGRIND_MAKE_MEM_NOACCESS(bo_gem->gtt_virtual, 0));
         drm_munmap(bo_gem->gtt_virtual, bo_gem->bo.size);
+        bo_gem->gtt_virtual = nullptr;
     }
     if (bo_gem->mem_wc_virtual) {
-        VG(VALGRIND_FREELIKE_BLOCK(bo_gem->mem_wc_virtual, 0));
+        VG(VALGRIND_MAKE_MEM_NOACCESS(bo_gem->mem_wc_virtual, 0));
         drm_munmap(bo_gem->mem_wc_virtual, bo_gem->bo.size);
+        bo_gem->mem_wc_virtual = nullptr;
     }
 
     /* Close this object */
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_HPM/codec/hal/enc/av1/features/encode_av1_basic_feature_xe_hpm.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_HPM/codec/hal/enc/av1/features/encode_av1_basic_feature_xe_hpm.cpp
index f5cde52..85096fd 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_HPM/codec/hal/enc/av1/features/encode_av1_basic_feature_xe_hpm.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_HPM/codec/hal/enc/av1/features/encode_av1_basic_feature_xe_hpm.cpp
@@ -39,6 +39,8 @@
 
     ENCODE_CHK_STATUS_RETURN(m_ref.SetPostCdefAsEncRef(true));
 
+    m_postCdefReconSurfaceFlag = true;
+
     return MOS_STATUS_SUCCESS;
 
 }
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_HPM/shared/mediacopy/media_copy_xe_hpm.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_HPM/shared/mediacopy/media_copy_xe_hpm.cpp
index 177a739..27495a3 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_HPM/shared/mediacopy/media_copy_xe_hpm.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_HPM/shared/mediacopy/media_copy_xe_hpm.cpp
@@ -181,7 +181,7 @@
 
     if (m_veboxCopyState)
     {
-        supported = m_veboxCopyState->IsFormatSupported(src) && m_veboxCopyState->IsFormatSupported(dst);
+        supported = m_veboxCopyState->IsSurfaceSupported(src) && m_veboxCopyState->IsSurfaceSupported(dst);
     }
 
     if (src->TileType == MOS_TILE_LINEAR &&
@@ -245,3 +245,13 @@
 
     return MOS_STATUS_SUCCESS;
 }
+
+MOS_STATUS MediaCopyState_Xe_Hpm::CopyEnigneSelect(MCPY_METHOD &preferMethod, MCPY_ENGINE &mcpyEngine, MCPY_ENGINE_CAPS &caps)
+{
+    if (preferMethod == MCPY_METHOD_DEFAULT)
+    {
+        preferMethod = MCPY_METHOD_PERFORMANCE;
+    }
+    MediaCopyBaseState::CopyEnigneSelect(preferMethod, mcpyEngine, caps);
+    return MOS_STATUS_SUCCESS;
+}
\ No newline at end of file
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_HPM/shared/mediacopy/media_copy_xe_hpm.h b/media_driver/media_softlet/agnostic/Xe_M/Xe_HPM/shared/mediacopy/media_copy_xe_hpm.h
index 45e04fa..c561be6 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_HPM/shared/mediacopy/media_copy_xe_hpm.h
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_HPM/shared/mediacopy/media_copy_xe_hpm.h
@@ -140,7 +140,30 @@
     //!
     virtual MOS_STATUS MediaVeboxCopy(PMOS_RESOURCE src, PMOS_RESOURCE dst);
 
+    //!
+    //! \brief    vebox format support.
+    //! \details  surface format support.
+    //! \param    src
+    //!           [in] Pointer to source surface
+    //! \param    dst
+    //!           [in] Pointer to destination surface
+    //! \return   bool
+    //!           Return true if support, otherwise return false.
+    //!
     virtual bool IsVeboxCopySupported(PMOS_RESOURCE src, PMOS_RESOURCE dst);
+    //!
+    //! \brief    select copy enigne
+    //! \details  media copy select copy enigne.
+    //! \param    preferMethod
+    //!           [in] copy method
+    //! \param    mcpyEngine
+    //!           [in] copy engine
+    //! \param    caps
+    //!           [in] reference of featue supported engine
+    //! \return   MOS_STATUS
+    //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
+    //!
+    virtual MOS_STATUS CopyEnigneSelect(MCPY_METHOD &preferMethod, MCPY_ENGINE &mcpyEngine, MCPY_ENGINE_CAPS &caps);
 
 protected:
     MhwInterfaces      *m_mhwInterfacesXeHpm  = nullptr;
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/avc/packet/decode_avc_picture_xe_m_base_packet.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/avc/packet/decode_avc_picture_xe_m_base_packet.cpp
index bd0611f..035a7e6 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/avc/packet/decode_avc_picture_xe_m_base_packet.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/avc/packet/decode_avc_picture_xe_m_base_packet.cpp
@@ -589,26 +589,20 @@
         {
             if (m_avcBasicFeature->m_refFrames.m_avcPicIdx[n].bValid)
             {
-                if (&avcDirectmodeParams.presAvcDmvBuffers[n+1] != nullptr)
-                {
-                    std::string mvBufDumpName = "_DEC_Ref_MV_" + std::to_string(n);
-                    DECODE_CHK_STATUS(debugInterface->DumpBuffer(
-                        &avcDirectmodeParams.presAvcDmvBuffers[n+1],
-                        CodechalDbgAttr::attrMvData,
-                        mvBufDumpName.c_str(),
-                        mvBufferSize));
-                }
+                std::string mvBufDumpName = "_DEC_Ref_MV_" + std::to_string(n);
+                DECODE_CHK_STATUS(debugInterface->DumpBuffer(
+                    &avcDirectmodeParams.presAvcDmvBuffers[n+1],
+                    CodechalDbgAttr::attrMvData,
+                    mvBufDumpName.c_str(),
+                    mvBufferSize));
             }
         }
 
-        if (&avcDirectmodeParams.presAvcDmvBuffers[0] != nullptr)
-        {
-            DECODE_CHK_STATUS(debugInterface->DumpBuffer(
-                &avcDirectmodeParams.presAvcDmvBuffers[0],
-                CodechalDbgAttr::attrMvData,
-                "DEC_Cur_MV_",
-                mvBufferSize));
-        }
+        DECODE_CHK_STATUS(debugInterface->DumpBuffer(
+            &avcDirectmodeParams.presAvcDmvBuffers[0],
+            CodechalDbgAttr::attrMvData,
+            "DEC_Cur_MV_",
+            mvBufferSize));
         return MOS_STATUS_SUCCESS;
     }
 
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 310bee1..56ac373 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
@@ -316,6 +316,13 @@
             inputParameters.isSecondField              = m_basicFeature->m_secondField;
             inputParameters.numUsedVdbox               = m_numVdbox;
 
+            CODECHAL_DEBUG_TOOL(
+                if (m_streamout != nullptr)  
+                {  
+                    DECODE_CHK_STATUS(m_streamout->InitStatusReportParam(inputParameters));  
+                }  
+            );
+
 #ifdef _DECODE_PROCESSING_SUPPORTED
             CODECHAL_DEBUG_TOOL(
                 DecodeDownSamplingFeature* downSamplingFeature = dynamic_cast<DecodeDownSamplingFeature*>(
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 3450ad5..ddcc869 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
@@ -346,6 +346,14 @@
             inputParameters.numUsedVdbox               = m_numVdbox;
             inputParameters.numSlices                  = m_basicFeature->m_numSlices;
             inputParameters.currDecodedPicRes          = m_basicFeature->m_destSurface.OsResource;
+
+            CODECHAL_DEBUG_TOOL(
+                if (m_streamout != nullptr)  
+                {  
+                    DECODE_CHK_STATUS(m_streamout->InitStatusReportParam(inputParameters));  
+                }  
+            );
+
 #if (_DEBUG || _RELEASE_INTERNAL)
 #ifdef _DECODE_PROCESSING_SUPPORTED
             DecodeDownSamplingFeature* downSamplingFeature = dynamic_cast<DecodeDownSamplingFeature*>(
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 1924a2a..f688cd9 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
@@ -276,6 +276,14 @@
             inputParameters.currOriginalPic            = m_basicFeature->m_curRenderPic;
             inputParameters.currDecodedPicRes          = m_basicFeature->m_destSurface.OsResource;
             inputParameters.numUsedVdbox               = m_numVdbox;
+
+            CODECHAL_DEBUG_TOOL(
+                if (m_streamout != nullptr)  
+                {  
+                    DECODE_CHK_STATUS(m_streamout->InitStatusReportParam(inputParameters));  
+                }  
+            );
+
 #if (_DEBUG || _RELEASE_INTERNAL)
 #ifdef _DECODE_PROCESSING_SUPPORTED
             DecodeDownSamplingFeature *downSamplingFeature = dynamic_cast<DecodeDownSamplingFeature *>(
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/mpeg2/pipeline/decode_mpeg2_pipeline_m12.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/mpeg2/pipeline/decode_mpeg2_pipeline_m12.cpp
index b7209b2..d43b527 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/mpeg2/pipeline/decode_mpeg2_pipeline_m12.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/dec/mpeg2/pipeline/decode_mpeg2_pipeline_m12.cpp
@@ -285,6 +285,13 @@
         inputParameters.currDecodedPicRes          = m_basicFeature->m_destSurface.OsResource;
         inputParameters.numUsedVdbox               = m_numVdbox;
 
+            CODECHAL_DEBUG_TOOL(
+                if (m_streamout != nullptr)  
+                {  
+                    DECODE_CHK_STATUS(m_streamout->InitStatusReportParam(inputParameters));  
+                }  
+            );
+
         m_statusReport->Init(&inputParameters);
     }
 
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 f516370..e459bfe 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
@@ -115,6 +115,14 @@
             inputParameters.currOriginalPic            = m_basicFeature->m_curRenderPic;
             inputParameters.currDecodedPicRes          = m_basicFeature->m_destSurface.OsResource;
             inputParameters.numUsedVdbox               = m_numVdbox;
+            
+            CODECHAL_DEBUG_TOOL(
+                if (m_streamout != nullptr)  
+                {  
+                    DECODE_CHK_STATUS(m_streamout->InitStatusReportParam(inputParameters));  
+                }  
+            );
+
 #if (_DEBUG || _RELEASE_INTERNAL)
 #ifdef _DECODE_PROCESSING_SUPPORTED
             DecodeDownSamplingFeature *downSamplingFeature = dynamic_cast<DecodeDownSamplingFeature *>(
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/enc/av1/packet/encode_av1_vdenc_packet_xe_m_base.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/enc/av1/packet/encode_av1_vdenc_packet_xe_m_base.cpp
index 16bdde3..829c3fe 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/enc/av1/packet/encode_av1_vdenc_packet_xe_m_base.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/enc/av1/packet/encode_av1_vdenc_packet_xe_m_base.cpp
@@ -255,72 +255,6 @@
         return MOS_STATUS_SUCCESS;
     }
 
-    MOS_STATUS Av1VdencPktXe_M_Base::PatchPictureLevelCommands(const uint8_t &packetPhase, MOS_COMMAND_BUFFER  &cmdBuffer)
-    {
-        ENCODE_FUNC_CALL();
-
-        ENCODE_CHK_STATUS_RETURN(m_miItf->SetWatchdogTimerThreshold(m_basicFeature->m_frameWidth, m_basicFeature->m_frameHeight, true));
-
-        SetPerfTag();
-
-        bool firstTaskInPhase = packetPhase & firstPacket;
-        if (!m_pipeline->IsSingleTaskPhaseSupported() || firstTaskInPhase)
-        {
-            ENCODE_CHK_STATUS_RETURN(AddForceWakeup(cmdBuffer));
-
-            // Send command buffer header at the beginning (OS dependent)
-            ENCODE_CHK_STATUS_RETURN(SendPrologCmds(cmdBuffer));
-        }
-
-        if (m_pipeline->GetPipeNum() >= 2)
-        {
-            auto scalability = m_pipeline->GetMediaScalability();
-
-            ENCODE_CHK_STATUS_RETURN(scalability->SyncPipe(syncOtherPipesForOne, 0, &cmdBuffer));
-        }
-
-        ENCODE_CHK_STATUS_RETURN(AddCondBBEndFor2ndPass(cmdBuffer));
-
-        if(m_pipeline->GetPipeNum() >= 2 && m_pipeline->IsFirstPipe())
-        {
-            PMOS_RESOURCE bsSizeBuf = m_basicFeature->m_recycleBuf->GetBuffer(PakInfo, 0);
-            ENCODE_CHK_NULL_RETURN(bsSizeBuf);
-            // clear bitstream size buffer at first tile
-            auto &miStoreDataParams            = m_miItf->MHW_GETPAR_F(MI_STORE_DATA_IMM)();
-            miStoreDataParams                  = {};
-            miStoreDataParams.pOsResource      = bsSizeBuf;
-            miStoreDataParams.dwResourceOffset = 0;
-            miStoreDataParams.dwValue          = 0;
-            ENCODE_CHK_STATUS_RETURN(m_miItf->MHW_ADDCMD_F(MI_STORE_DATA_IMM)(&cmdBuffer));
-        }
-
-        if (m_pipeline->IsFirstPipe())
-        {
-            ENCODE_CHK_STATUS_RETURN(StartStatusReport(statusReportMfx, &cmdBuffer));
-        }
-        else{
-            // add perf record for other pipes - first pipe perf record within StartStatusReport
-            MediaPerfProfiler *perfProfiler = MediaPerfProfiler::Instance();
-            ENCODE_CHK_NULL_RETURN(perfProfiler);
-            ENCODE_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectStartCmd(
-                (void *)m_pipeline, m_osInterface, m_miItf, &cmdBuffer));
-        }
-
-        ENCODE_CHK_STATUS_RETURN(AddPictureVdencCommands(cmdBuffer));
-
-        return MOS_STATUS_SUCCESS;
-    }
-
-    MOS_STATUS Av1VdencPktXe_M_Base::Construct3rdLevelBatch()
-    {
-        MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
-
-        //To be added. When BRC is enabled, some of the commands
-        //will be added into 3rd level batch
-
-        return eStatus;
-    }
-
     MOS_STATUS Av1VdencPktXe_M_Base::AddOneTileCommands(
         MOS_COMMAND_BUFFER &cmdBuffer,
         uint32_t tileRow,
@@ -524,251 +458,6 @@
         return MOS_STATUS_SUCCESS;
     }
 
-    MOS_STATUS Av1VdencPktXe_M_Base::UpdateUserFeatureKey(PMOS_SURFACE surface)
-    {
-        if (m_userFeatureUpdated_post_cdef)
-        {
-            return MOS_STATUS_SUCCESS;
-        }
-        m_userFeatureUpdated_post_cdef = true;
-        ReportUserSetting(m_userSettingPtr,
-            "AV1 Post CDEF Recon Compressible",
-            surface->bCompressible,
-            MediaUserSetting::Group::Sequence);
-        ReportUserSetting(m_userSettingPtr ,
-            "AV1 Post CDEF Recon Compress Mode",
-            surface->MmcState,
-            MediaUserSetting::Group::Sequence);
-        return MOS_STATUS_SUCCESS;
-    }
-
-    MOS_STATUS Av1VdencPktXe_M_Base::PatchTileLevelCommands(MOS_COMMAND_BUFFER &cmdBuffer, uint8_t packetPhase)
-    {
-        ENCODE_FUNC_CALL();
-
-        ENCODE_CHK_STATUS_RETURN(Construct3rdLevelBatch());
-
-        uint16_t numTileColumns = 1;
-        uint16_t numTileRows = 1;
-        RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, Av1FeatureIDs::encodeTile, GetTileRowColumns, numTileRows, numTileColumns);
-
-        ENCODE_CHK_NULL_RETURN(m_pipeline);
-        ENCODE_CHK_NULL_RETURN(m_av1PicParams);
-        if (!m_pipeline->IsDualEncEnabled())
-        {
-            for (uint32_t tileRow = 0; tileRow < numTileRows; tileRow++)
-            {
-                for (uint32_t tileCol = 0; tileCol < numTileColumns; tileCol++)
-                {
-                    ENCODE_CHK_STATUS_RETURN(AddOneTileCommands(
-                        cmdBuffer,
-                        tileRow,
-                        tileCol));
-                }
-            }
-        }
-        else
-        {
-            if(numTileRows != 1)  // dual encode only support column based workload submission
-            {
-                ENCODE_ASSERTMESSAGE("dual encode cannot support multi rows submission yet.");
-                return MOS_STATUS_INVALID_PARAMETER;
-            }
-            uint8_t dummyIdx = 0;
-            RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, Av1FeatureIDs::encodeTile, GetDummyIdx, dummyIdx);
-            if (m_pipeline->GetCurrentPipe() == 0)
-            {
-                for (auto i = 0; i < dummyIdx; i++)
-                {
-                    ENCODE_CHK_STATUS_RETURN(AddOneTileCommands(
-                        cmdBuffer,
-                        0,
-                        i));
-                }
-                ENCODE_CHK_STATUS_RETURN(AddOneTileCommands(
-                    cmdBuffer,
-                    0,
-                    dummyIdx,
-                    1));
-            }
-            else
-            {
-                for (auto i = dummyIdx; i < numTileColumns; i++)
-                {
-                    ENCODE_CHK_STATUS_RETURN(AddOneTileCommands(
-                        cmdBuffer,
-                        0,
-                        i));
-                }
-            }
-        }
-
-        m_basicFeature->m_flushCmd = Av1BasicFeature::waitAvp;
-        SETPAR_AND_ADDCMD(VD_PIPELINE_FLUSH, m_vdencItf, &cmdBuffer);
-
-        ENCODE_CHK_STATUS_RETURN(EnsureAllCommandsExecuted(cmdBuffer));
-
-        // Wait all pipe cmds done for the packet
-        auto scalability = m_pipeline->GetMediaScalability();
-        ENCODE_CHK_STATUS_RETURN(scalability->SyncPipe(syncOnePipeWaitOthers, 0, &cmdBuffer));
-
-        if (m_pipeline->IsFirstPipe()) 
-        {
-            for (auto i = 0; i < m_pipeline->GetPipeNum(); ++i)
-            {
-                ENCODE_CHK_STATUS_RETURN(scalability->ResetSemaphore(syncOnePipeWaitOthers, i, &cmdBuffer));
-            }
-            ENCODE_CHK_STATUS_RETURN(EndStatusReport(statusReportMfx, &cmdBuffer));
-        }
-        else{
-            // add perf record for other pipes - first pipe perf record within EndStatusReport
-            MediaPerfProfiler *perfProfiler = MediaPerfProfiler::Instance();
-            ENCODE_CHK_NULL_RETURN(perfProfiler);
-            ENCODE_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectEndCmd(
-                (void *)m_pipeline, m_osInterface, m_miItf, &cmdBuffer));
-        }
-        auto brcFeature = dynamic_cast<Av1Brc *>(m_featureManager->GetFeature(Av1FeatureIDs::av1BrcFeature));
-        ENCODE_CHK_NULL_RETURN(brcFeature);
-
-        if (Mos_Solo_Extension(m_osInterface->pOsContext))
-        {
-            ENCODE_CHK_STATUS_RETURN(MediaPacket::UpdateStatusReportNext(statusReportGlobalCount, &cmdBuffer));
-        }
-        else if (brcFeature->IsBRCEnabled() && m_osInterface->bInlineCodecStatusUpdate)
-        {
-            ENCODE_CHK_STATUS_RETURN(UpdateStatusReport(statusReportGlobalCount, &cmdBuffer));
-        }
-        else if (m_pipeline->IsLastPass() && m_pipeline->IsFirstPipe())
-        {
-            ENCODE_CHK_STATUS_RETURN(MediaPacket::UpdateStatusReportNext(statusReportGlobalCount, &cmdBuffer));
-        }
-
-        if (m_pipeline->IsDualEncEnabled())
-        {
-            SETPAR_AND_ADDCMD(VDENC_CONTROL_STATE, m_vdencItf, &cmdBuffer);
-        }
-
-        CODECHAL_DEBUG_TOOL(
-            if (m_mmcState) {
-                m_mmcState->UpdateUserFeatureKey(&(m_basicFeature->m_reconSurface));
-            })
-
-        PCODEC_REF_LIST currRefList     = m_basicFeature->m_ref.GetCurrRefList();
-        MOS_SURFACE *  postCdefSurface = m_basicFeature->m_trackedBuf->GetSurface(
-            BufferType::postCdefReconSurface, currRefList->ucScalingIdx);
-
-        CODECHAL_DEBUG_TOOL(
-            if (m_mmcState) { UpdateUserFeatureKey(postCdefSurface);})
-        UpdateParameters();
-
-        return MOS_STATUS_SUCCESS;
-    }
-
-    void Av1VdencPktXe_M_Base::UpdateParameters()
-    {
-        ENCODE_FUNC_CALL();
-
-        Av1VdencPkt::UpdateParameters();
-
-        if (!m_pipeline->IsSingleTaskPhaseSupported())
-        {
-            m_osInterface->pfnResetPerfBufferID(m_osInterface);
-        }
-
-        //TBD
-    }
-
-    MHW_SETPAR_DECL_SRC(AVP_IND_OBJ_BASE_ADDR_STATE, Av1VdencPktXe_M_Base)
-    {
-        params.mvObjectOffset = m_mvOffset;
-        params.mvObjectSize   = m_basicFeature->m_mbCodeSize - m_mvOffset;
-
-        return MOS_STATUS_SUCCESS;
-    }
-
-    MHW_SETPAR_DECL_SRC(AVP_PIC_STATE, Av1VdencPktXe_M_Base)
-    {
-        params.notFirstPass = !m_pipeline->IsFirstPass();
-
-        return MOS_STATUS_SUCCESS;
-    }
-
-    MHW_SETPAR_DECL_SRC(AVP_TILE_CODING, Av1VdencPktXe_M_Base)
-    {
-        uint32_t tileIdx = 0;
-        RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, Av1FeatureIDs::encodeTile, GetTileIdx, tileIdx);
-        params.disableFrameContextUpdateFlag = m_av1PicParams->PicFlags.fields.disable_frame_end_update_cdf || (tileIdx != m_av1PicParams->context_update_tile_id);
-
-        return MOS_STATUS_SUCCESS;
-    }
-
-    MOS_STATUS Av1VdencPktXe_M_Base::AddAllCmds_AVP_PIPE_MODE_SELECT(PMOS_COMMAND_BUFFER cmdBuffer) const
-    {
-        ENCODE_FUNC_CALL();
-
-        auto &vdControlStateParams          = m_miItf->MHW_GETPAR_F(VD_CONTROL_STATE)();
-        vdControlStateParams                = {};
-        vdControlStateParams.initialization = true;
-        vdControlStateParams.avpEnabled     = true;
-        ENCODE_CHK_STATUS_RETURN(m_miItf->MHW_ADDCMD_F(VD_CONTROL_STATE)(cmdBuffer));
-
-        // for Gen11+, we need to add MFX wait for both KIN and VRT before and after AVP Pipemode select.
-        auto &mfxWaitParams                 = m_miItf->MHW_GETPAR_F(MFX_WAIT)();
-        mfxWaitParams                       = {};
-        mfxWaitParams.iStallVdboxPipeline   = true;
-        ENCODE_CHK_STATUS_RETURN(m_miItf->MHW_ADDCMD_F(MFX_WAIT)(cmdBuffer));
-
-        SETPAR_AND_ADDCMD(AVP_PIPE_MODE_SELECT, m_avpItf, cmdBuffer);
-
-        // for Gen11+, we need to add MFX wait for both KIN and VRT before and after AVP Pipemode select.
-        mfxWaitParams                       = {};
-        mfxWaitParams.iStallVdboxPipeline   = true;
-        ENCODE_CHK_STATUS_RETURN(m_miItf->MHW_ADDCMD_F(MFX_WAIT)(cmdBuffer));
-
-        // AVP Lock for multiple pipe mode
-        if (m_pipeline->GetPipeNum() > 1)
-        {
-            vdControlStateParams                      = {};
-            vdControlStateParams.avpEnabled           = true;
-            vdControlStateParams.scalableModePipeLock = true;
-            ENCODE_CHK_STATUS_RETURN(m_miItf->MHW_ADDCMD_F(VD_CONTROL_STATE)(cmdBuffer));
-        }
-
-        return MOS_STATUS_SUCCESS;
-    }
-
-    MOS_STATUS Av1VdencPktXe_M_Base::AddAllCmds_AVP_SEGMENT_STATE(PMOS_COMMAND_BUFFER cmdBuffer) const
-    {
-        ENCODE_FUNC_CALL();
-
-        ENCODE_CHK_NULL_RETURN(m_featureManager);
-
-        auto& par = m_avpItf->MHW_GETPAR_F(AVP_SEGMENT_STATE)();
-        par      = {};
-
-        auto segmentFeature = dynamic_cast<Av1Segmentation *>(m_featureManager->GetFeature(Av1FeatureIDs::av1Segmentation));
-        ENCODE_CHK_NULL_RETURN(segmentFeature);
-
-        MHW_CHK_STATUS_RETURN(segmentFeature->MHW_SETPAR_F(AVP_SEGMENT_STATE)(par));
-
-        const bool segmentEnabled = par.av1SegmentParams.m_enabled;
-
-        for (uint8_t i = 0; i < av1MaxSegments; i++)
-        {
-            par.currentSegmentId = i;
-            m_avpItf->MHW_ADDCMD_F(AVP_SEGMENT_STATE)(cmdBuffer);
-
-            // If segmentation is not enabled, then AV1_SEGMENT_STATE must still be sent once for SegmentID = 0
-            // If i == numSegments -1, means all segments are issued, break the loop
-            if (!segmentEnabled || (i == par.numSegments - 1))
-            {
-                break;
-            }
-        }
-
-        return MOS_STATUS_SUCCESS;
-    }
-
     MOS_STATUS Av1VdencPktXe_M_Base::CalculateAvpPictureStateCommandSize(uint32_t * commandsSize, uint32_t * patchListSize)
     {
         ENCODE_FUNC_CALL();
@@ -809,45 +498,4 @@
 
         return MOS_STATUS_SUCCESS;
     }
-
-#if USE_CODECHAL_DEBUG_TOOL
-    MOS_STATUS Av1VdencPktXe_M_Base::DumpStatistics()
-    {
-
-        CodechalDebugInterface *debugInterface =  m_pipeline->GetStatusReportDebugInterface();
-        ENCODE_CHK_NULL_RETURN(debugInterface);
-
-        ENCODE_CHK_STATUS_RETURN(debugInterface->DumpBuffer(
-            m_basicFeature->m_tileStatisticsPakStreamoutBuffer,
-            CodechalDbgAttr::attrTileBasedStats,
-            "Pak_Tile_Stats",
-            512,
-            0,
-            CODECHAL_NUM_MEDIA_STATES));
-
-        MOS_RESOURCE* tileStatisticsBuffer = nullptr;
-        RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, FeatureIDs::encodeTile, GetTileBasedStatisticsBuffer, 0, tileStatisticsBuffer);
-        uint32_t offset = 0;
-        RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, Av1FeatureIDs::encodeTile, GetTileStatsOffset, offset);
-
-        ENCODE_CHK_STATUS_RETURN(debugInterface->DumpBuffer(
-            tileStatisticsBuffer,
-            CodechalDbgAttr::attrFrameState,
-            "VDEnc_Frame_Stats",
-            m_hwInterface->m_pakIntTileStatsSize,
-            offset,
-            CODECHAL_NUM_MEDIA_STATES));
-
-        MOS_RESOURCE *pakinfo = m_basicFeature->m_recycleBuf->GetBuffer(PakInfo, 0);
-        ENCODE_CHK_STATUS_RETURN(debugInterface->DumpBuffer(
-            pakinfo,
-            CodechalDbgAttr::attrFrameState,
-            "VDEnc_PAK_INFO",
-            MOS_ALIGN_CEIL(sizeof(Av1VdencPakInfo), CODECHAL_PAGE_SIZE),
-            0,
-            CODECHAL_NUM_MEDIA_STATES));
-
-        return MOS_STATUS_SUCCESS;
-    }
-#endif  // USE_CODECHAL_DEBUG_TOOL
     }   // namespace encode
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/enc/av1/packet/encode_av1_vdenc_packet_xe_m_base.h b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/enc/av1/packet/encode_av1_vdenc_packet_xe_m_base.h
index 494814c..884f62c 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/enc/av1/packet/encode_av1_vdenc_packet_xe_m_base.h
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_M_base/codec/hal/enc/av1/packet/encode_av1_vdenc_packet_xe_m_base.h
@@ -75,19 +75,13 @@
             uint8_t packetPhase = otherPacket) override;
 
     protected:
-        MOS_STATUS PatchTileLevelCommands(MOS_COMMAND_BUFFER &cmdBuffer, uint8_t packetPhase);
         MOS_STATUS AddOneTileCommands(
             MOS_COMMAND_BUFFER  &cmdBuffer,
             uint32_t            tileRow,
             uint32_t            tileCol,
-            uint32_t            tileRowPass = 0);
+            uint32_t            tileRowPass = 0) override;
 
-        MOS_STATUS Construct3rdLevelBatch();
-
-        void UpdateParameters() override;
-
-        MOS_STATUS EnsureAllCommandsExecuted(MOS_COMMAND_BUFFER &cmdBuffer);
-        MOS_STATUS PatchPictureLevelCommands(const uint8_t &packetPhase, MOS_COMMAND_BUFFER  &cmdBuffer);
+        MOS_STATUS EnsureAllCommandsExecuted(MOS_COMMAND_BUFFER &cmdBuffer) override;
 
         virtual MOS_STATUS AllocateResources() override;
 
@@ -95,23 +89,6 @@
         virtual MOS_STATUS CalculateAvpCommandsSize() override;
 
         MOS_STATUS RegisterPostCdef();
-        MOS_STATUS UpdateUserFeatureKey(PMOS_SURFACE surface);
-
-        MHW_SETPAR_DECL_HDR(AVP_IND_OBJ_BASE_ADDR_STATE);
-
-        MHW_SETPAR_DECL_HDR(AVP_PIC_STATE);
-
-        MHW_SETPAR_DECL_HDR(AVP_TILE_CODING);
-
-        MOS_STATUS AddAllCmds_AVP_SEGMENT_STATE(PMOS_COMMAND_BUFFER cmdBuffer) const;
-
-        MOS_STATUS AddAllCmds_AVP_PIPE_MODE_SELECT(PMOS_COMMAND_BUFFER cmdBuffer) const;
-
-#if USE_CODECHAL_DEBUG_TOOL
-        MOS_STATUS DumpStatistics();
-#endif  // USE_CODECHAL_DEBUG_TOOL
-
-        bool  m_userFeatureUpdated_post_cdef = false;  //!< Inidate if mmc user feature key for post cdef is updated
 
     private:
         uint16_t m_tileColStartSb[64];  //!< tile column start SB
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/codec/hal/enc/hevc/pipeline/encode_hevc_vdenc_pipeline_adapter_xe_xpm_base.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/codec/hal/enc/hevc/pipeline/encode_hevc_vdenc_pipeline_adapter_xe_xpm_base.cpp
index 001ea1b..d769296 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/codec/hal/enc/hevc/pipeline/encode_hevc_vdenc_pipeline_adapter_xe_xpm_base.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/codec/hal/enc/hevc/pipeline/encode_hevc_vdenc_pipeline_adapter_xe_xpm_base.cpp
@@ -70,6 +70,14 @@
     return m_encoder->ExecuteResolveMetaData(pInput, pOutput);
 }
 
+#if (_DEBUG || _RELEASE_INTERNAL)
+MOS_STATUS EncodeHevcVdencPipelineAdapterXe_Xpm_Base::Reformat()
+{
+    m_encoder->PrepareReformat();
+    return m_encoder->Reformat();
+}
+#endif
+
 void EncodeHevcVdencPipelineAdapterXe_Xpm_Base::Destroy()
 {
     ENCODE_FUNC_CALL();
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/codec/hal/enc/hevc/pipeline/encode_hevc_vdenc_pipeline_adapter_xe_xpm_base.h b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/codec/hal/enc/hevc/pipeline/encode_hevc_vdenc_pipeline_adapter_xe_xpm_base.h
index dd19437..900cb00 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/codec/hal/enc/hevc/pipeline/encode_hevc_vdenc_pipeline_adapter_xe_xpm_base.h
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/codec/hal/enc/hevc/pipeline/encode_hevc_vdenc_pipeline_adapter_xe_xpm_base.h
@@ -44,6 +44,10 @@
 
     virtual MOS_STATUS Execute(void *params) override;
 
+#if (_DEBUG || _RELEASE_INTERNAL)
+    virtual MOS_STATUS Reformat() override;
+#endif
+
     virtual MOS_STATUS GetStatusReport(void *status, uint16_t numStatus) override;
 
     virtual MOS_STATUS ResolveMetaData(PMOS_RESOURCE pInput, PMOS_RESOURCE pOutput) override;
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/codec/hal/enc/hevc/pipeline/encode_hevc_vdenc_pipeline_xe_xpm_base.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/codec/hal/enc/hevc/pipeline/encode_hevc_vdenc_pipeline_xe_xpm_base.cpp
index 630aa96..79f6b95 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/codec/hal/enc/hevc/pipeline/encode_hevc_vdenc_pipeline_xe_xpm_base.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/codec/hal/enc/hevc/pipeline/encode_hevc_vdenc_pipeline_xe_xpm_base.cpp
@@ -289,4 +289,16 @@
     return MOS_STATUS_SUCCESS;
 }
 
+MOS_STATUS HevcVdencPipelineXe_Xpm_Base::Reformat()
+{
+    ENCODE_FUNC_CALL();
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS HevcVdencPipelineXe_Xpm_Base::PrepareReformat()
+{
+    ENCODE_FUNC_CALL();
+    return MOS_STATUS_SUCCESS;
+}
+
 }
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/codec/hal/enc/hevc/pipeline/encode_hevc_vdenc_pipeline_xe_xpm_base.h b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/codec/hal/enc/hevc/pipeline/encode_hevc_vdenc_pipeline_xe_xpm_base.h
index 7bfb587..b214e66 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/codec/hal/enc/hevc/pipeline/encode_hevc_vdenc_pipeline_xe_xpm_base.h
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/codec/hal/enc/hevc/pipeline/encode_hevc_vdenc_pipeline_xe_xpm_base.h
@@ -51,6 +51,10 @@
 
     virtual MOS_STATUS Prepare(void *params) override;
 
+    virtual MOS_STATUS Reformat();
+
+    virtual MOS_STATUS PrepareReformat();
+
     virtual MOS_STATUS Execute() override;
 
     virtual MOS_STATUS GetStatusReport(void *status, uint16_t numStatus) override;
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/shared/mediacopy/media_copy_xe_xpm_base.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/shared/mediacopy/media_copy_xe_xpm_base.cpp
index 34cd782..365afd5 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/shared/mediacopy/media_copy_xe_xpm_base.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_base/shared/mediacopy/media_copy_xe_xpm_base.cpp
@@ -157,7 +157,7 @@
 
     if (m_veboxCopyState)
     {
-        supported = m_veboxCopyState->IsFormatSupported(src) && m_veboxCopyState->IsFormatSupported(dst);
+        supported = m_veboxCopyState->IsSurfaceSupported(src) && m_veboxCopyState->IsSurfaceSupported(dst);
     }
 
     if (src->TileType == MOS_TILE_LINEAR &&
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_plus/shared/mediacopy/media_copy_xe_xpm_plus.cpp b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_plus/shared/mediacopy/media_copy_xe_xpm_plus.cpp
index 444d94e..2565c82 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_plus/shared/mediacopy/media_copy_xe_xpm_plus.cpp
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_plus/shared/mediacopy/media_copy_xe_xpm_plus.cpp
@@ -192,7 +192,12 @@
     }
 }
 
-MOS_STATUS MediaCopyStateXe_Xpm_Plus::CapabilityCheck(MCPY_STATE_PARAMS& mcpySrc, MCPY_STATE_PARAMS& mcpyDst, MCPY_ENGINE_CAPS& caps)
+MOS_STATUS MediaCopyStateXe_Xpm_Plus::CapabilityCheck(
+    MOS_FORMAT         format,
+    MCPY_STATE_PARAMS &mcpySrc,
+    MCPY_STATE_PARAMS &mcpyDst,
+    MCPY_ENGINE_CAPS  &caps,
+    MCPY_METHOD        preferMethod)
 {
     // init hw enigne caps.pvc doesn't have vebox
     caps.engineBlt    = 1;
@@ -226,7 +231,7 @@
     return MOS_STATUS_SUCCESS;
 }
 
-MOS_STATUS MediaCopyStateXe_Xpm_Plus::CopyEnigneSelect(MCPY_METHOD preferMethod, MCPY_ENGINE& mcpyEngine, MCPY_ENGINE_CAPS& caps)
+MOS_STATUS MediaCopyStateXe_Xpm_Plus::CopyEnigneSelect(MCPY_METHOD& preferMethod, MCPY_ENGINE& mcpyEngine, MCPY_ENGINE_CAPS& caps)
 {
     // assume perf render > vebox > blt. blt data should be measured.
     // driver should make sure there is at least one he can process copy even customer choice doesn't match caps.
diff --git a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_plus/shared/mediacopy/media_copy_xe_xpm_plus.h b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_plus/shared/mediacopy/media_copy_xe_xpm_plus.h
index e24f429..052192a 100644
--- a/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_plus/shared/mediacopy/media_copy_xe_xpm_plus.h
+++ b/media_driver/media_softlet/agnostic/Xe_M/Xe_XPM_plus/shared/mediacopy/media_copy_xe_xpm_plus.h
@@ -93,6 +93,8 @@
     //!
     //! \brief    check copy capability.
     //! \details  to determine surface copy is supported or not.
+    //! \param    format
+    //!           [in] surface format
     //! \param    mcpySrc
     //!           [in] Pointer to source paramters
     //! \param    mcpyDst
@@ -102,7 +104,12 @@
     //! \return   MOS_STATUS
     //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
     //!
-    virtual MOS_STATUS CapabilityCheck(MCPY_STATE_PARAMS& mcpySrc, MCPY_STATE_PARAMS& mcpyDst, MCPY_ENGINE_CAPS& caps);
+    virtual MOS_STATUS CapabilityCheck(
+        MOS_FORMAT         format,
+        MCPY_STATE_PARAMS &mcpySrc,
+        MCPY_STATE_PARAMS &mcpyDst,
+        MCPY_ENGINE_CAPS  &caps,
+        MCPY_METHOD        preferMethod);
 
     //!
     //! \brief    select copy enigne
@@ -116,7 +123,7 @@
     //! \return   MOS_STATUS
     //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
     //!
-    MOS_STATUS CopyEnigneSelect(MCPY_METHOD preferMethod, MCPY_ENGINE& mcpyEngine, MCPY_ENGINE_CAPS& caps);
+    MOS_STATUS CopyEnigneSelect(MCPY_METHOD& preferMethod, MCPY_ENGINE& mcpyEngine, MCPY_ENGINE_CAPS& caps);
 
 protected:
 
diff --git a/media_driver/media_softlet/agnostic/common/vp/hal/packet/vp_render_sfc_base_legacy.cpp b/media_driver/media_softlet/agnostic/common/vp/hal/packet/vp_render_sfc_base_legacy.cpp
index 2a89e59..20d4d6f 100644
--- a/media_driver/media_softlet/agnostic/common/vp/hal/packet/vp_render_sfc_base_legacy.cpp
+++ b/media_driver/media_softlet/agnostic/common/vp/hal/packet/vp_render_sfc_base_legacy.cpp
@@ -690,6 +690,7 @@
     m_renderDataLegacy.sfcStateParams->fColorFillUGPixel = scalingParams->sfcColorfillParams.fColorFillUGPixel;
     m_renderDataLegacy.sfcStateParams->fColorFillVBPixel = scalingParams->sfcColorfillParams.fColorFillVBPixel;
     m_renderDataLegacy.sfcStateParams->fColorFillYRPixel = scalingParams->sfcColorfillParams.fColorFillYRPixel;
+    m_renderDataLegacy.sfcStateParams->isDemosaicEnabled = scalingParams->isDemosaicNeeded;
 
     // SfcInputFormat should be initialized during SetCscParams if SfcInputFormat not being Format_Any.
     if (Format_Any == m_renderDataLegacy.SfcInputFormat)
@@ -747,6 +748,7 @@
 
     m_renderDataLegacy.sfcStateParams->bRGBASwapEnable  = IsOutputChannelSwapNeeded(cscParams->outputFormat);
     m_renderDataLegacy.sfcStateParams->bInputColorSpace = cscParams->isInputColorSpaceRGB;
+    m_renderDataLegacy.sfcStateParams->isDemosaicEnabled = cscParams->isDemosaicNeeded;
 
     // Chromasitting config
     // VEBOX use polyphase coefficients for 1x scaling for better quality,
@@ -879,7 +881,14 @@
     }
     else if (MhwSfcInterface::SFC_PIPE_MODE_VEBOX == m_pipeMode)
     {
-        sfcStateParams->dwVDVEInputOrderingMode = MEDIASTATE_SFC_INPUT_ORDERING_VE_4x8;
+        if (m_renderDataLegacy.sfcStateParams && m_renderDataLegacy.sfcStateParams->isDemosaicEnabled)
+        {
+            sfcStateParams->dwVDVEInputOrderingMode = MEDIASTATE_SFC_INPUT_ORDERING_VE_4x4;
+        }
+        else
+        {
+            sfcStateParams->dwVDVEInputOrderingMode = MEDIASTATE_SFC_INPUT_ORDERING_VE_4x8;
+        }
     }
     else if (MEDIASTATE_SFC_PIPE_VE_TO_SFC_INTEGRAL == m_pipeMode)
     {
diff --git a/media_driver/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_cmd_packet_legacy.cpp b/media_driver/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_cmd_packet_legacy.cpp
index 4b42838..4bf24d0 100644
--- a/media_driver/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_cmd_packet_legacy.cpp
+++ b/media_driver/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_cmd_packet_legacy.cpp
@@ -121,6 +121,61 @@
     return MOS_STATUS_SUCCESS;
 }
 
+MOS_STATUS VpVeboxCmdPacketLegacy::SetupVeboxExternal3DLutforHDR(
+    PMHW_VEBOX_STATE_CMD_PARAMS pVeboxStateCmdParams)
+{
+    PMHW_VEBOX_MODE    pVeboxMode  = nullptr;
+    PMHW_VEBOX_3D_LUT  pLUT3D      = nullptr;
+    PMHW_3DLUT_PARAMS  external3DLutParams = nullptr;
+    PMOS_INTERFACE     osInterface  = nullptr;
+    VpVeboxRenderData *pRenderData = GetLastExecRenderData();
+    external3DLutParams = &(pRenderData->GetIECPParams().s3DLutParams);
+
+    VP_RENDER_CHK_NULL_RETURN(m_surfMemCacheCtl);
+    VP_RENDER_CHK_NULL_RETURN(pVeboxStateCmdParams);
+    VP_RENDER_CHK_NULL_RETURN(pRenderData);
+    VP_PUBLIC_CHK_NULL_RETURN(external3DLutParams);
+    VP_PUBLIC_CHK_NULL_RETURN(m_hwInterface->m_osInterface);
+
+    osInterface = m_hwInterface->m_osInterface;
+    pVeboxMode = &pVeboxStateCmdParams->VeboxMode;
+    pLUT3D     = &pVeboxStateCmdParams->LUT3D;
+    VP_PUBLIC_CHK_NULL_RETURN(pLUT3D);
+    pLUT3D->ArbitrationPriorityControl = 0;
+    pLUT3D->Lut3dEnable                = true;
+    pLUT3D->Lut3dSize                  = 0;
+
+    switch (external3DLutParams->LUTSize)
+    {
+        case 17:
+            pLUT3D->Lut3dSize = 1;
+            break;
+        case 65:
+            pLUT3D->Lut3dSize = 2;
+            break;
+        case 45:
+            pLUT3D->Lut3dSize = 3;
+            break;
+        case 33:
+        default:
+            pLUT3D->Lut3dSize = 0;
+            break;
+    }
+
+    VP_RENDER_CHK_STATUS_RETURN(osInterface->pfnRegisterResource(
+        osInterface,
+        &(pRenderData->HDR3DLUT.external3DLutSurfResource),
+        false,
+        true));
+
+    pVeboxStateCmdParams->Vebox3DLookUpTablesSurfCtrl.Value =
+        m_surfMemCacheCtl->DnDi.Vebox3DLookUpTablesSurfMemObjCtl;
+    pVeboxMode->ColorGamutExpansionEnable = true;
+    pVeboxStateCmdParams->pVebox3DLookUpTables = &(pRenderData->HDR3DLUT.external3DLutSurfResource);
+
+    return MOS_STATUS_SUCCESS;
+}
+
 MOS_STATUS VpVeboxCmdPacketLegacy::SetupVebox3DLutForHDR(
     PMHW_VEBOX_STATE_CMD_PARAMS pVeboxStateCmdParams)
 {
@@ -182,6 +237,13 @@
     VP_RENDER_CHK_NULL_RETURN(renderData);
     VP_RENDER_CHK_NULL_RETURN(veboxStateCmdParams);
 
+    if (renderData->HDR3DLUT.isExternal3DLutTable)
+    {
+        VP_RENDER_CHK_STATUS_RETURN(SetupVebox3DLutForHDR(veboxStateCmdParams));
+        VP_RENDER_NORMALMESSAGE("3DLUT table setup by API.");
+        return MOS_STATUS_SUCCESS;
+    }
+
     if (renderData->HDR3DLUT.bHdr3DLut)
     {
         VP_RENDER_CHK_STATUS_RETURN(SetupVebox3DLutForHDR(veboxStateCmdParams));
@@ -1076,6 +1138,7 @@
     VP_PUBLIC_CHK_NULL_RETURN(m_hwInterface->m_osInterface);
     VP_PUBLIC_CHK_NULL_RETURN(hdrParams);
     VP_RENDER_ASSERT(pRenderData);
+    MHW_VEBOX_IECP_PARAMS  &mhwVeboxIecpParams  = pRenderData->GetIECPParams();
     MHW_VEBOX_GAMUT_PARAMS &mhwVeboxGamutParams = pRenderData->GetGamutParams();
     pOsInterface                       = m_hwInterface->m_osInterface;
     pRenderData->HDR3DLUT.bHdr3DLut    = true;
@@ -1083,11 +1146,15 @@
     pRenderData->HDR3DLUT.is3DLutTableFilled          = HDR_STAGE::HDR_STAGE_VEBOX_3DLUT_UPDATE == hdrParams->stage ||
                                                         HDR_STAGE::HDR_STAGE_VEBOX_3DLUT_NO_UPDATE == hdrParams->stage;
     pRenderData->HDR3DLUT.is3DLutTableUpdatedByKernel = HDR_STAGE::HDR_STAGE_VEBOX_3DLUT_UPDATE == hdrParams->stage;
+    pRenderData->HDR3DLUT.isExternal3DLutTable    = HDR_STAGE::HDR_STAGE_VEBOX_EXTERNAL_3DLUT == hdrParams->stage;
     pRenderData->HDR3DLUT.uiMaxDisplayLum      = hdrParams->uiMaxDisplayLum;
     pRenderData->HDR3DLUT.uiMaxContentLevelLum = hdrParams->uiMaxContentLevelLum;
     pRenderData->HDR3DLUT.hdrMode              = hdrParams->hdrMode;
 
-    VP_RENDER_CHK_STATUS_RETURN(ValidateHDR3DLutParameters(pRenderData->HDR3DLUT.is3DLutTableFilled));
+    if (!(hdrParams->stage == HDR_STAGE_VEBOX_EXTERNAL_3DLUT))
+    {
+        VP_RENDER_CHK_STATUS_RETURN(ValidateHDR3DLutParameters(pRenderData->HDR3DLUT.is3DLutTableFilled));
+    }
 
     // Use Gamut
     mhwVeboxGamutParams.ColorSpace       = VpHalCspace2MhwCspace(hdrParams->srcColorSpace);
@@ -1107,6 +1174,18 @@
         mhwVeboxGamutParams.uiMaxCLL = 0;
     }
 
+    if (hdrParams->stage == HDR_STAGE_VEBOX_EXTERNAL_3DLUT)
+    {
+        if (hdrParams->external3DLutParams)
+        {
+            mhwVeboxIecpParams.s3DLutParams.LUTSize = hdrParams->external3DLutParams->LutSize;
+            pRenderData->HDR3DLUT.external3DLutSurfResource = hdrParams->external3DLutParams->pExt3DLutSurface->OsResource;
+        }
+        else
+        {
+            VP_RENDER_ASSERTMESSAGE("hdrParams external3DLutParams is null.");
+        }
+    }
     //Report
     if (m_hwInterface->m_reporting)
     {
diff --git a/media_driver/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_cmd_packet_legacy.h b/media_driver/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_cmd_packet_legacy.h
index 40d928e..aaa08e2 100644
--- a/media_driver/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_cmd_packet_legacy.h
+++ b/media_driver/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_cmd_packet_legacy.h
@@ -804,6 +804,9 @@
     MOS_STATUS SetupVebox3DLutForHDR(
         PMHW_VEBOX_STATE_CMD_PARAMS pVeboxStateCmdParams);
 
+    MOS_STATUS SetupVeboxExternal3DLutforHDR(
+        PMHW_VEBOX_STATE_CMD_PARAMS pVeboxStateCmdParams);
+
 protected:
 #if (_DEBUG || _RELEASE_INTERNAL)
     virtual MOS_STATUS StallBatchBuffer(
diff --git a/media_driver/media_softlet/agnostic/gen12/codec/hal/dec/av1/pipeline/decode_av1_pipeline_g12.cpp b/media_driver/media_softlet/agnostic/gen12/codec/hal/dec/av1/pipeline/decode_av1_pipeline_g12.cpp
index 10e1c8b..bb40e26 100644
--- a/media_driver/media_softlet/agnostic/gen12/codec/hal/dec/av1/pipeline/decode_av1_pipeline_g12.cpp
+++ b/media_driver/media_softlet/agnostic/gen12/codec/hal/dec/av1/pipeline/decode_av1_pipeline_g12.cpp
@@ -152,6 +152,13 @@
                 inputParameters.currDecodedPicRes          = basicFeature->m_destSurface.OsResource;
                 inputParameters.numUsedVdbox               = m_numVdbox;
 
+                CODECHAL_DEBUG_TOOL(
+                    if (m_streamout != nullptr)  
+                    {  
+                        DECODE_CHK_STATUS(m_streamout->InitStatusReportParam(inputParameters));  
+                    }  
+                );
+
 #if (_DEBUG || _RELEASE_INTERNAL)
                 auto filmGrainFeature = dynamic_cast<Av1DecodeFilmGrainG12*>(m_featureManager->GetFeature(
                         Av1FeatureIDs::av1SwFilmGrain));
diff --git a/media_driver/media_softlet/agnostic/m12/m12_0/shared/mediacopy/media_copy_m12_0.cpp b/media_driver/media_softlet/agnostic/m12/m12_0/shared/mediacopy/media_copy_m12_0.cpp
index e5087bd..b2c7062 100644
--- a/media_driver/media_softlet/agnostic/m12/m12_0/shared/mediacopy/media_copy_m12_0.cpp
+++ b/media_driver/media_softlet/agnostic/m12/m12_0/shared/mediacopy/media_copy_m12_0.cpp
@@ -141,7 +141,7 @@
 
     if (m_veboxCopyState)
     {
-        supported = m_veboxCopyState->IsFormatSupported(src) && m_veboxCopyState->IsFormatSupported(dst);
+        supported = m_veboxCopyState->IsSurfaceSupported(src) && m_veboxCopyState->IsSurfaceSupported(dst);
     }
 
     if (src->TileType == MOS_TILE_LINEAR &&
@@ -168,3 +168,59 @@
     return MOS_STATUS_UNIMPLEMENTED;
 }
 
+MOS_STATUS MediaCopyStateM12_0::TaskDispatch(MCPY_STATE_PARAMS mcpySrc, MCPY_STATE_PARAMS mcpyDst, MCPY_ENGINE mcpyEngine)
+{
+    MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
+    MosUtilities::MosLockMutex(m_inUseGPUMutex);
+    switch (mcpyEngine)
+    {
+    case MCPY_ENGINE_VEBOX:
+        eStatus = MediaVeboxCopy(mcpySrc.OsRes, mcpyDst.OsRes);
+        break;
+    case MCPY_ENGINE_BLT:
+        if ((mcpySrc.TileMode != MOS_TILE_LINEAR) && (mcpySrc.CompressionMode != MOS_MMC_DISABLED))
+        {
+            MCPY_NORMALMESSAGE("mmc on, mcpySrc.TileMode= %d, mcpySrc.CompressionMode = %d", mcpySrc.TileMode, mcpySrc.CompressionMode);
+            eStatus = m_osInterface->pfnDecompResource(m_osInterface, mcpySrc.OsRes);
+            if (MOS_STATUS_SUCCESS != eStatus)
+            {
+                MosUtilities::MosUnlockMutex(m_inUseGPUMutex);
+                MCPY_CHK_STATUS_RETURN(eStatus);
+            }
+        }
+        if ((mcpyDst.TileMode != MOS_TILE_LINEAR) && (mcpyDst.CompressionMode == MOS_MMC_RC))
+        {
+            MCPY_NORMALMESSAGE("mmc on, mcpyDst.TileMode= %d, mcpyDst.CompressionMode = %d", mcpyDst.TileMode, mcpyDst.CompressionMode);
+            eStatus = m_osInterface->pfnDecompResource(m_osInterface, mcpyDst.OsRes);
+            if (MOS_STATUS_SUCCESS != eStatus)
+            {
+                MosUtilities::MosUnlockMutex(m_inUseGPUMutex);
+                MCPY_CHK_STATUS_RETURN(eStatus);
+            }
+        }
+        eStatus = MediaBltCopy(mcpySrc.OsRes, mcpyDst.OsRes);
+        break;
+    case MCPY_ENGINE_RENDER:
+        eStatus = MediaRenderCopy(mcpySrc.OsRes, mcpyDst.OsRes);
+        break;
+    default:
+        break;
+    }
+    MosUtilities::MosUnlockMutex(m_inUseGPUMutex);
+
+#if (_DEBUG || _RELEASE_INTERNAL)
+    if (m_bRegReport)
+    {
+        std::string               copyEngine     = mcpyEngine ? (mcpyEngine == MCPY_ENGINE_BLT ? "BLT" : "Render") : "VeBox";
+        MediaUserSettingSharedPtr userSettingPtr = m_osInterface->pfnGetUserSettingInstance(m_osInterface);
+        ReportUserSettingForDebug(
+            userSettingPtr,
+            __MEDIA_USER_FEATURE_MCPY_MODE,
+            copyEngine,
+            MediaUserSetting::Group::Device);
+    }
+#endif
+    MCPY_NORMALMESSAGE("Media Copy works on %s Engine", mcpyEngine ? (mcpyEngine == MCPY_ENGINE_BLT ? "BLT" : "Render") : "VeBox");
+
+    return eStatus;
+}
\ No newline at end of file
diff --git a/media_driver/media_softlet/agnostic/m12/m12_0/shared/mediacopy/media_copy_m12_0.h b/media_driver/media_softlet/agnostic/m12/m12_0/shared/mediacopy/media_copy_m12_0.h
index 7e26701..f7d38dc 100644
--- a/media_driver/media_softlet/agnostic/m12/m12_0/shared/mediacopy/media_copy_m12_0.h
+++ b/media_driver/media_softlet/agnostic/m12/m12_0/shared/mediacopy/media_copy_m12_0.h
@@ -119,6 +119,7 @@
     virtual MOS_STATUS MediaVeboxCopy(PMOS_RESOURCE src, PMOS_RESOURCE dst);
 
     virtual bool IsVeboxCopySupported(PMOS_RESOURCE src, PMOS_RESOURCE dst);
+    virtual MOS_STATUS TaskDispatch(MCPY_STATE_PARAMS mcpySrc, MCPY_STATE_PARAMS mcpyDst, MCPY_ENGINE mcpyEngine);
 
     MhwInterfaces   *m_mhwInterfaces  = nullptr;
     BltState        *m_bltState       = nullptr;
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus/hw/mhw_mmio_xe_lpm_plus.h b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus/hw/mhw_mmio_xe_lpm_plus.h
index 993e89b..ed065ca 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus/hw/mhw_mmio_xe_lpm_plus.h
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus/hw/mhw_mmio_xe_lpm_plus.h
@@ -210,4 +210,8 @@
 
 #define M_CCS_HW_FRONT_END_MMIO_MASK                                                     0x7FF
 
+//Bilitter engine
+#define M_MMIO_BLT_AUX_TABLE_BASE_LOW 0x4240
+#define M_MMIO_BLT_AUX_TABLE_BASE_HIGH 0x4244
+
 #endif   //__MHW_MMIO_XE_LPM_PLUS_H__
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 61a1434..6d7b040 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
@@ -147,6 +147,13 @@
                 inputParameters.currOriginalPic            = basicFeature->m_curRenderPic;
                 inputParameters.currDecodedPicRes          = basicFeature->m_destSurface.OsResource;
                 inputParameters.numUsedVdbox               = m_numVdbox;
+                
+            CODECHAL_DEBUG_TOOL(
+                if (m_streamout != nullptr)  
+                {  
+                    DECODE_CHK_STATUS(m_streamout->InitStatusReportParam(inputParameters));  
+                }  
+            );
 #ifdef _DECODE_PROCESSING_SUPPORTED
                 CODECHAL_DEBUG_TOOL(
                     DecodeDownSamplingFeature *downSamplingFeature = dynamic_cast<DecodeDownSamplingFeature *>(
@@ -185,6 +192,7 @@
 
         auto basicFeature = dynamic_cast<Av1BasicFeature *>(m_featureManager->GetFeature(FeatureIDs::basicFeature));
         DECODE_CHK_NULL(basicFeature);
+        DECODE_CHK_NULL(basicFeature->m_av1PicParams);
         if (basicFeature->m_av1PicParams->m_anchorFrameInsertion)
         {
             return MOS_STATUS_SUCCESS;
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 474cca3..8d50605 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
@@ -220,6 +220,13 @@
             inputParameters.currDecodedPicRes          = m_basicFeature->m_destSurface.OsResource;
             inputParameters.numUsedVdbox               = m_numVdbox;
 
+            CODECHAL_DEBUG_TOOL(
+                if (m_streamout != nullptr)  
+                {  
+                    DECODE_CHK_STATUS(m_streamout->InitStatusReportParam(inputParameters));  
+                }  
+            );
+
 #ifdef _DECODE_PROCESSING_SUPPORTED
             CODECHAL_DEBUG_TOOL(
                 DecodeDownSamplingFeature* downSamplingFeature = dynamic_cast<DecodeDownSamplingFeature*>(
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/hevc/packet/decode_huc_s2l_packet_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/hevc/packet/decode_huc_s2l_packet_xe_lpm_plus_base.cpp
index 78c5073..67dadfd 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/hevc/packet/decode_huc_s2l_packet_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/hevc/packet/decode_huc_s2l_packet_xe_lpm_plus_base.cpp
@@ -51,7 +51,10 @@
 
     MOS_STATUS HucS2lPktXe_Lpm_Plus_Base::Destroy()
     {
-        DECODE_CHK_STATUS(m_allocator->Destroy(m_s2lDmemBufferArray));
+        if (m_allocator != nullptr)
+        {
+            DECODE_CHK_STATUS(m_allocator->Destroy(m_s2lDmemBufferArray));
+        }
 
         DECODE_CHK_STATUS(HucS2lPkt::Destroy());
         return MOS_STATUS_SUCCESS;
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 1b2f012..8b1967d 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
@@ -253,6 +253,14 @@
             inputParameters.numUsedVdbox               = m_numVdbox;
             inputParameters.numSlices                  = m_basicFeature->m_numSlices;
             inputParameters.currDecodedPicRes          = m_basicFeature->m_destSurface.OsResource;
+
+            CODECHAL_DEBUG_TOOL(
+                if (m_streamout != nullptr)  
+                {  
+                    DECODE_CHK_STATUS(m_streamout->InitStatusReportParam(inputParameters));  
+                }  
+            );
+
 #if (_DEBUG || _RELEASE_INTERNAL)
 #ifdef _DECODE_PROCESSING_SUPPORTED
             DecodeDownSamplingFeature* downSamplingFeature = dynamic_cast<DecodeDownSamplingFeature*>(
@@ -345,7 +353,10 @@
 MOS_STATUS HevcPipelineXe_Lpm_Plus_Base::Destroy()
 {
     DECODE_FUNC_CALL();
-    DECODE_CHK_STATUS(m_allocator->Destroy(m_secondLevelBBArray));
+    if (m_allocator != nullptr)
+    {
+        DECODE_CHK_STATUS(m_allocator->Destroy(m_secondLevelBBArray));
+    }
     DECODE_CHK_STATUS(Uninitialize());
 
     return MOS_STATUS_SUCCESS;
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 9759a34..7e0a18e 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
@@ -192,6 +192,14 @@
             inputParameters.currOriginalPic            = m_basicFeature->m_curRenderPic;
             inputParameters.currDecodedPicRes          = m_basicFeature->m_destSurface.OsResource;
             inputParameters.numUsedVdbox               = m_numVdbox;
+
+            CODECHAL_DEBUG_TOOL(
+                if (m_streamout != nullptr)  
+                {  
+                    DECODE_CHK_STATUS(m_streamout->InitStatusReportParam(inputParameters));  
+                }  
+            );
+
 #if (_DEBUG || _RELEASE_INTERNAL)
 #ifdef _DECODE_PROCESSING_SUPPORTED
             DecodeDownSamplingFeature *downSamplingFeature = dynamic_cast<DecodeDownSamplingFeature *>(
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/mpeg2/pipeline/decode_mpeg2_pipeline_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/mpeg2/pipeline/decode_mpeg2_pipeline_xe_lpm_plus_base.cpp
index cb11659..e5cc21a 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/mpeg2/pipeline/decode_mpeg2_pipeline_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/mpeg2/pipeline/decode_mpeg2_pipeline_xe_lpm_plus_base.cpp
@@ -192,6 +192,13 @@
         inputParameters.currDecodedPicRes          = m_basicFeature->m_destSurface.OsResource;
         inputParameters.numUsedVdbox               = m_numVdbox;
 
+        CODECHAL_DEBUG_TOOL(
+            if (m_streamout != nullptr)  
+            {  
+                DECODE_CHK_STATUS(m_streamout->InitStatusReportParam(inputParameters));  
+            }  
+        );
+
         m_statusReport->Init(&inputParameters);
     }
 
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/vp8/pipeline/decode_vp8_pipeline_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/vp8/pipeline/decode_vp8_pipeline_xe_lpm_plus_base.cpp
index a9ac31c..39a55df 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/vp8/pipeline/decode_vp8_pipeline_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/dec/vp8/pipeline/decode_vp8_pipeline_xe_lpm_plus_base.cpp
@@ -92,6 +92,13 @@
             inputParameters.currDecodedPicRes          = m_basicFeature->m_destSurface.OsResource;
             inputParameters.numUsedVdbox               = m_numVdbox;
 
+            CODECHAL_DEBUG_TOOL(
+                if (m_streamout != nullptr)  
+                {  
+                    DECODE_CHK_STATUS(m_streamout->InitStatusReportParam(inputParameters));  
+                }  
+            );
+
             m_statusReport->Init(&inputParameters);
         }
     }
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 6cd3be6..dd1feab 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
@@ -104,6 +104,14 @@
             inputParameters.currOriginalPic            = m_basicFeature->m_curRenderPic;
             inputParameters.currDecodedPicRes          = m_basicFeature->m_destSurface.OsResource;
             inputParameters.numUsedVdbox               = m_numVdbox;
+
+            CODECHAL_DEBUG_TOOL(
+                if (m_streamout != nullptr)  
+                {  
+                    DECODE_CHK_STATUS(m_streamout->InitStatusReportParam(inputParameters));  
+                }  
+            );
+
 #if (_DEBUG || _RELEASE_INTERNAL)
 #ifdef _DECODE_PROCESSING_SUPPORTED
             DecodeDownSamplingFeature *downSamplingFeature = dynamic_cast<DecodeDownSamplingFeature *>(
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/av1/features/encode_av1_basic_feature_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/av1/features/encode_av1_basic_feature_xe_lpm_plus_base.cpp
index 529086c..a4a0f77 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/av1/features/encode_av1_basic_feature_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/av1/features/encode_av1_basic_feature_xe_lpm_plus_base.cpp
@@ -41,7 +41,8 @@
     ENCODE_CHK_NULL_RETURN(superResFeature);
     if (superResFeature->IsEnabled())
     {
-        m_rawSurfaceToEnc = superResFeature->GetRawSurfaceToEnc();
+        m_rawSurfaceToEnc          = superResFeature->GetRawSurfaceToEnc();
+        m_postCdefReconSurfaceFlag = true;
     }
 
     return MOS_STATUS_SUCCESS;
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/av1/packet/encode_av1_vdenc_packet_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/av1/packet/encode_av1_vdenc_packet_xe_lpm_plus_base.cpp
index 96ca0df..0174241 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/av1/packet/encode_av1_vdenc_packet_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/av1/packet/encode_av1_vdenc_packet_xe_lpm_plus_base.cpp
@@ -368,77 +368,6 @@
     return MOS_STATUS_SUCCESS;
 }
 
-MOS_STATUS Av1VdencPktXe_Lpm_Plus_Base::PatchPictureLevelCommands(const uint8_t &packetPhase, MOS_COMMAND_BUFFER &cmdBuffer)
-{
-    ENCODE_FUNC_CALL();
-
-    ENCODE_CHK_STATUS_RETURN(m_miItf->SetWatchdogTimerThreshold(m_basicFeature->m_frameWidth, m_basicFeature->m_frameHeight, true));
-
-    SetPerfTag();
-
-    const bool firstTaskInPhase = packetPhase & firstPacket;
-    const auto brcFeature       = dynamic_cast<Av1Brc *>(m_featureManager->GetFeature(Av1FeatureIDs::av1BrcFeature));
-    ENCODE_CHK_NULL_RETURN(brcFeature);
-
-    // if BRC is enabled, MI_FORCE_WAKEUP and prolog commands are added by BRC packet
-    if (firstTaskInPhase || !brcFeature->IsBRCEnabled())
-    {
-        ENCODE_CHK_STATUS_RETURN(AddForceWakeup(cmdBuffer));
-
-        // Send command buffer header at the beginning (OS dependent)
-        ENCODE_CHK_STATUS_RETURN(SendPrologCmds(cmdBuffer));
-    }
-
-    if (m_pipeline->GetPipeNum() >= 2)
-    {
-        auto scalability = m_pipeline->GetMediaScalability();
-
-        ENCODE_CHK_STATUS_RETURN(scalability->SyncPipe(syncOtherPipesForOne, 0, &cmdBuffer));
-    }
-
-    ENCODE_CHK_STATUS_RETURN(AddCondBBEndFor2ndPass(cmdBuffer));
-
-    if (m_pipeline->GetPipeNum() >= 2 && m_pipeline->IsFirstPipe())
-    {
-        PMOS_RESOURCE bsSizeBuf = m_basicFeature->m_recycleBuf->GetBuffer(PakInfo, 0);
-        ENCODE_CHK_NULL_RETURN(bsSizeBuf);
-        // clear bitstream size buffer at first tile
-        auto& miStoreDataParams = m_miItf->MHW_GETPAR_F(MI_STORE_DATA_IMM)();
-        miStoreDataParams = {};
-        miStoreDataParams.pOsResource = bsSizeBuf;
-        miStoreDataParams.dwResourceOffset = 0;
-        miStoreDataParams.dwValue = 0;
-        ENCODE_CHK_STATUS_RETURN(m_miItf->MHW_ADDCMD_F(MI_STORE_DATA_IMM)(&cmdBuffer));
-    }
-
-    if (m_pipeline->IsFirstPipe())
-    {
-        ENCODE_CHK_STATUS_RETURN(StartStatusReport(statusReportMfx, &cmdBuffer));
-    }
-    else {
-        // add perf record for other pipes - first pipe perf record within StartStatusReport
-        MediaPerfProfiler* perfProfiler = MediaPerfProfiler::Instance();
-        ENCODE_CHK_NULL_RETURN(perfProfiler);
-        ENCODE_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectStartCmd(
-            (void*)m_pipeline, m_osInterface, m_miItf, &cmdBuffer));
-    }
-
-    ENCODE_CHK_STATUS_RETURN(AddPictureVdencCommands(cmdBuffer));
-
-    return MOS_STATUS_SUCCESS;
-}
-
-
-MOS_STATUS Av1VdencPktXe_Lpm_Plus_Base::Construct3rdLevelBatch()
-{
-    MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
-
-    //To be added. When BRC is enabled, some of the commands
-    //will be added into 3rd level batch
-
-    return eStatus;
-}
-
 MOS_STATUS Av1VdencPktXe_Lpm_Plus_Base::AddOneTileCommands(
     MOS_COMMAND_BUFFER &cmdBuffer,
     uint32_t            tileRow,
@@ -642,278 +571,4 @@
 
     return MOS_STATUS_SUCCESS;
 }
-
-MOS_STATUS Av1VdencPktXe_Lpm_Plus_Base::UpdateUserFeatureKey(PMOS_SURFACE surface)
-{
-    if (m_userFeatureUpdated_post_cdef)
-    {
-        return MOS_STATUS_SUCCESS;
-    }
-    m_userFeatureUpdated_post_cdef = true;
-
-    ReportUserSetting(
-        m_userSettingPtr,
-        "AV1 Post CDEF Recon Compressible",
-        surface->bCompressible,
-        MediaUserSetting::Group::Sequence);
-    ReportUserSetting(
-        m_userSettingPtr,
-        "AV1 Post CDEF Recon Compress Mode",
-        surface->MmcState,
-        MediaUserSetting::Group::Sequence);
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS Av1VdencPktXe_Lpm_Plus_Base::PatchTileLevelCommands(MOS_COMMAND_BUFFER &cmdBuffer, uint8_t packetPhase)
-{
-    ENCODE_FUNC_CALL();
-
-    ENCODE_CHK_STATUS_RETURN(Construct3rdLevelBatch());
-
-    uint16_t numTileColumns = 1;
-    uint16_t numTileRows    = 1;
-    RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, Av1FeatureIDs::encodeTile, GetTileRowColumns, numTileRows, numTileColumns);
-
-    ENCODE_CHK_NULL_RETURN(m_pipeline);
-    ENCODE_CHK_NULL_RETURN(m_av1PicParams);
-    if (!m_pipeline->IsDualEncEnabled())
-    {
-        for (uint32_t tileRow = 0; tileRow < numTileRows; tileRow++)
-        {
-            for (uint32_t tileCol = 0; tileCol < numTileColumns; tileCol++)
-            {
-                ENCODE_CHK_STATUS_RETURN(AddOneTileCommands(
-                    cmdBuffer,
-                    tileRow,
-                    tileCol));
-            }
-        }
-    }
-    else
-    {
-        if (numTileRows != 1)  // dual encode only support column based workload submission
-        {
-            ENCODE_ASSERTMESSAGE("dual encode cannot support multi rows submission yet.");
-            return MOS_STATUS_INVALID_PARAMETER;
-        }
-        uint8_t dummyIdx = 0;
-        RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, Av1FeatureIDs::encodeTile, GetDummyIdx, dummyIdx);
-        if (m_pipeline->GetCurrentPipe() == 0)
-        {
-            for (auto i = 0; i < dummyIdx; i++)
-            {
-                ENCODE_CHK_STATUS_RETURN(AddOneTileCommands(
-                    cmdBuffer,
-                    0,
-                    i));
-            }
-            ENCODE_CHK_STATUS_RETURN(AddOneTileCommands(
-                cmdBuffer,
-                0,
-                dummyIdx,
-                1));
-        }
-        else
-        {
-            for (auto i = dummyIdx; i < numTileColumns; i++)
-            {
-                ENCODE_CHK_STATUS_RETURN(AddOneTileCommands(
-                    cmdBuffer,
-                    0,
-                    i));
-            }
-        }
-    }
-
-    m_basicFeature->m_flushCmd = Av1BasicFeature::waitAvp;
-    SETPAR_AND_ADDCMD(VD_PIPELINE_FLUSH, m_vdencItf, &cmdBuffer);
-
-    ENCODE_CHK_STATUS_RETURN(EnsureAllCommandsExecuted(cmdBuffer));
-
-    // Wait all pipe cmds done for the packet
-    auto scalability = m_pipeline->GetMediaScalability();
-    ENCODE_CHK_STATUS_RETURN(scalability->SyncPipe(syncOnePipeWaitOthers, 0, &cmdBuffer));
-
-    if (m_pipeline->IsFirstPipe())
-    {
-        for (auto i = 0; i < m_pipeline->GetPipeNum(); ++i)
-        {
-            ENCODE_CHK_STATUS_RETURN(scalability->ResetSemaphore(syncOnePipeWaitOthers, i, &cmdBuffer));
-        }
-        ENCODE_CHK_STATUS_RETURN(EndStatusReport(statusReportMfx, &cmdBuffer));
-    }
-    else {
-        // add perf record for other pipes - first pipe perf record within EndStatusReport
-        MediaPerfProfiler* perfProfiler = MediaPerfProfiler::Instance();
-        ENCODE_CHK_NULL_RETURN(perfProfiler);
-        ENCODE_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectEndCmd(
-            (void*)m_pipeline, m_osInterface, m_miItf, &cmdBuffer));
-    }
-
-    auto brcFeature = dynamic_cast<Av1Brc *>(m_featureManager->GetFeature(Av1FeatureIDs::av1BrcFeature));
-    ENCODE_CHK_NULL_RETURN(brcFeature);
-
-    if (Mos_Solo_Extension((MOS_CONTEXT_HANDLE)m_osInterface->pOsContext))
-    {
-        ENCODE_CHK_STATUS_RETURN(MediaPacket::UpdateStatusReportNext(statusReportGlobalCount, &cmdBuffer));
-    }
-    else if (brcFeature->IsBRCEnabled() && m_osInterface->bInlineCodecStatusUpdate)
-    {
-        ENCODE_CHK_STATUS_RETURN(UpdateStatusReport(statusReportGlobalCount, &cmdBuffer));
-    }
-    else if (m_pipeline->IsLastPass() && m_pipeline->IsFirstPipe())
-    {
-        ENCODE_CHK_STATUS_RETURN(MediaPacket::UpdateStatusReportNext(statusReportGlobalCount, &cmdBuffer));
-    }
-
-    if (m_pipeline->IsDualEncEnabled())
-    {
-        SETPAR_AND_ADDCMD(VDENC_CONTROL_STATE, m_vdencItf, &cmdBuffer);
-    }
-
-    CODECHAL_DEBUG_TOOL(
-        if (m_mmcState) {
-            m_mmcState->UpdateUserFeatureKey(&(m_basicFeature->m_reconSurface));
-        })
-
-    if (m_av1SeqParams->CodingToolFlags.fields.enable_superres)
-    {
-        PCODEC_REF_LIST currRefList     = m_basicFeature->m_ref.GetCurrRefList();
-        MOS_SURFACE *postCdefSurface = m_basicFeature->m_trackedBuf->GetSurface(
-            BufferType::postCdefReconSurface, currRefList->ucScalingIdx);
-
-        CODECHAL_DEBUG_TOOL(
-            if (m_mmcState) { UpdateUserFeatureKey(postCdefSurface); })
-    }
-
-    UpdateParameters();
-
-    return MOS_STATUS_SUCCESS;
-}
-
-void Av1VdencPktXe_Lpm_Plus_Base::UpdateParameters()
-{
-    ENCODE_FUNC_CALL();
-
-    Av1VdencPkt::UpdateParameters();
-
-    if (!m_pipeline->IsSingleTaskPhaseSupported())
-    {
-        m_osInterface->pfnResetPerfBufferID(m_osInterface);
-    }
-}
-
-
-MHW_SETPAR_DECL_SRC(AVP_PIC_STATE, Av1VdencPktXe_Lpm_Plus_Base)
-{
-    params.notFirstPass = !m_pipeline->IsFirstPass();
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MHW_SETPAR_DECL_SRC(AVP_IND_OBJ_BASE_ADDR_STATE, Av1VdencPktXe_Lpm_Plus_Base)
-{
-    params.mvObjectOffset = m_mvOffset;
-    params.mvObjectSize   = m_basicFeature->m_mbCodeSize - m_mvOffset;
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MHW_SETPAR_DECL_SRC(AVP_TILE_CODING, Av1VdencPktXe_Lpm_Plus_Base)
-{
-    uint32_t tileIdx = 0;
-    RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, Av1FeatureIDs::encodeTile, GetTileIdx, tileIdx);
-    params.disableFrameContextUpdateFlag = m_av1PicParams->PicFlags.fields.disable_frame_end_update_cdf || (tileIdx != m_av1PicParams->context_update_tile_id);
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS Av1VdencPktXe_Lpm_Plus_Base::AddAllCmds_AVP_PIPE_MODE_SELECT(PMOS_COMMAND_BUFFER cmdBuffer) const
-{
-    ENCODE_FUNC_CALL();
-
-    ENCODE_CHK_NULL_RETURN(cmdBuffer);
-
-    auto &vdControlStateParams          = m_miItf->MHW_GETPAR_F(VD_CONTROL_STATE)();
-    vdControlStateParams                = {};
-    vdControlStateParams.initialization = true;
-    vdControlStateParams.avpEnabled     = true;
-    ENCODE_CHK_STATUS_RETURN(m_miItf->MHW_ADDCMD_F(VD_CONTROL_STATE)(cmdBuffer));
-
-    SETPAR_AND_ADDCMD(MFX_WAIT, m_miItf, cmdBuffer);
-    SETPAR_AND_ADDCMD(AVP_PIPE_MODE_SELECT, m_avpItf, cmdBuffer);
-    SETPAR_AND_ADDCMD(MFX_WAIT, m_miItf, cmdBuffer);
-
-    if (m_pipeline->GetPipeNum() > 1)
-    {
-        vdControlStateParams                      = {};
-        vdControlStateParams.avpEnabled           = true;
-        vdControlStateParams.scalableModePipeLock = true;
-        ENCODE_CHK_STATUS_RETURN(m_miItf->MHW_ADDCMD_F(VD_CONTROL_STATE)(cmdBuffer));
-    }
-
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS Av1VdencPktXe_Lpm_Plus_Base::AddAllCmds_AVP_SEGMENT_STATE(PMOS_COMMAND_BUFFER cmdBuffer) const
-{
-    ENCODE_FUNC_CALL();
-
-    ENCODE_CHK_NULL_RETURN(cmdBuffer);
-    ENCODE_CHK_NULL_RETURN(m_featureManager);
-
-    auto &par = m_avpItf->MHW_GETPAR_F(AVP_SEGMENT_STATE)();
-    par      = {};
-
-    auto segmentFeature = dynamic_cast<Av1Segmentation *>(m_featureManager->GetFeature(Av1FeatureIDs::av1Segmentation));
-    ENCODE_CHK_NULL_RETURN(segmentFeature);
-
-    MHW_CHK_STATUS_RETURN(segmentFeature->MHW_SETPAR_F(AVP_SEGMENT_STATE)(par));
-
-    const bool segmentEnabled = par.av1SegmentParams.m_enabled;
-
-    for (uint8_t i = 0; i < av1MaxSegments; i++)
-    {
-        par.currentSegmentId = i;
-        m_avpItf->MHW_ADDCMD_F(AVP_SEGMENT_STATE)(cmdBuffer);
-
-        // If segmentation is not enabled, then AV1_SEGMENT_STATE must still be sent once for SegmentID = 0
-        // If i == numSegments -1, means all segments are issued, break the loop
-        if (!segmentEnabled || (i == par.numSegments - 1))
-        {
-            break;
-        }
-    }
-
-    return MOS_STATUS_SUCCESS;
-}
-
-#if USE_CODECHAL_DEBUG_TOOL
-MOS_STATUS Av1VdencPktXe_Lpm_Plus_Base::DumpStatistics()
-{
-    CodechalDebugInterface* debugInterface = m_pipeline->GetStatusReportDebugInterface();
-    ENCODE_CHK_NULL_RETURN(debugInterface);
-
-    ENCODE_CHK_STATUS_RETURN(debugInterface->DumpBuffer(
-        m_basicFeature->m_tileStatisticsPakStreamoutBuffer,
-        CodechalDbgAttr::attrTileBasedStats,
-        "Pak_Tile_Stats",
-        512,
-        0,
-        CODECHAL_NUM_MEDIA_STATES));
-
-    MOS_RESOURCE* tileStatisticsBuffer = nullptr;
-    RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, FeatureIDs::encodeTile, GetTileBasedStatisticsBuffer, 0, tileStatisticsBuffer);
-
-    ENCODE_CHK_STATUS_RETURN(debugInterface->DumpBuffer(
-        tileStatisticsBuffer,
-        CodechalDbgAttr::attrFrameState,
-        "VDEnc_Frame_Stats",
-        m_hwInterface->m_pakIntTileStatsSize,
-        0,
-        CODECHAL_NUM_MEDIA_STATES));
-
-    return MOS_STATUS_SUCCESS;
-}
-#endif  // USE_CODECHAL_DEBUG_TOOL
 }  // namespace encode
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/av1/packet/encode_av1_vdenc_packet_xe_lpm_plus_base.h b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/av1/packet/encode_av1_vdenc_packet_xe_lpm_plus_base.h
index c742594..9543e7b 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/av1/packet/encode_av1_vdenc_packet_xe_lpm_plus_base.h
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/codec/hal/enc/av1/packet/encode_av1_vdenc_packet_xe_lpm_plus_base.h
@@ -60,45 +60,20 @@
         uint8_t             packetPhase = otherPacket) override;
 
 protected:
-    MOS_STATUS PatchTileLevelCommands(MOS_COMMAND_BUFFER &cmdBuffer, uint8_t packetPhase);
-
     virtual MOS_STATUS AddOneTileCommands(
         MOS_COMMAND_BUFFER &cmdBuffer,
         uint32_t            tileRow,
         uint32_t            tileCol,
-        uint32_t            tileRowPass = 0);
+        uint32_t            tileRowPass = 0) override;
 
     virtual MOS_STATUS AddCommandsExt(MOS_COMMAND_BUFFER& cmdBuffer) { return MOS_STATUS_SUCCESS; };
 
-    MOS_STATUS Construct3rdLevelBatch();
-
-    void UpdateParameters() override;
-
-    MOS_STATUS EnsureAllCommandsExecuted(MOS_COMMAND_BUFFER &cmdBuffer);
-
-    MOS_STATUS PatchPictureLevelCommands(const uint8_t &packetPhase, MOS_COMMAND_BUFFER &cmdBuffer);
+    MOS_STATUS EnsureAllCommandsExecuted(MOS_COMMAND_BUFFER &cmdBuffer) override;
 
     virtual MOS_STATUS AllocateResources() override;
 
     MOS_STATUS RegisterPostCdef();
 
-    MOS_STATUS UpdateUserFeatureKey(PMOS_SURFACE surface);
-
-    MHW_SETPAR_DECL_HDR(AVP_PIC_STATE);
-
-    MHW_SETPAR_DECL_HDR(AVP_IND_OBJ_BASE_ADDR_STATE);
-
-    MHW_SETPAR_DECL_HDR(AVP_TILE_CODING);
-
-    MOS_STATUS AddAllCmds_AVP_PIPE_MODE_SELECT(PMOS_COMMAND_BUFFER cmdBuffer) const;
-
-    MOS_STATUS AddAllCmds_AVP_SEGMENT_STATE(PMOS_COMMAND_BUFFER cmdBuffer) const;
-
-#if USE_CODECHAL_DEBUG_TOOL
-    virtual MOS_STATUS DumpStatistics();
-#endif  // USE_CODECHAL_DEBUG_TOOL
-
-    bool                   m_userFeatureUpdated_post_cdef                  = false;    //!< Inidate if mmc user feature key for post cdef is updated
     uint16_t               m_tileColStartSb[64]                            = {};       //!< tile column start SB
     uint16_t               m_tileRowStartSb[64]                            = {};       //!< tile row start SB
 
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/hw/mhw_blt_xe_lpm_plus_base_next_impl.h b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/hw/mhw_blt_xe_lpm_plus_base_next_impl.h
index 4d8fbd5..5ffd283 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/hw/mhw_blt_xe_lpm_plus_base_next_impl.h
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/hw/mhw_blt_xe_lpm_plus_base_next_impl.h
@@ -125,7 +125,30 @@
             cmd.DW1.DestinationControlSurfaceType = 0;  // 1 is media; 0 is 3D;
             cmd.DW14.DestinationCompressionFormat = dstCompressionFormat;
         }
-
+        if (srcMmcModel != MOS_MEMCOMP_DISABLED)
+        {
+            cmd.DW8.SourceCompressionEnable    = 1;
+            cmd.DW12.SourceCompressionFormat   = srcCompressionFormat;
+            cmd.DW8.SourceAuxiliarysurfacemode =
+                Cmd::XY_BLOCK_COPY_BLT_CMD::SOURCE_AUXILIARY_SURFACE_MODE_AUX_CCS_E;
+            if (srcMmcModel == MOS_MEMCOMP_MC)
+            {
+                cmd.DW8.SourceControlSurfaceType =
+                    Cmd::XY_BLOCK_COPY_BLT_CMD::SOURCE_CONTROL_SURFACE_TYPE_MEDIA_CONTROL_SURFACE;
+                if (params.dwPlaneNum >=2)
+                {
+                    // luma/chroma is represented by the MSB of the 5 bit format and used only for media decompression.
+                    if (params.dwPlaneIndex == 0)  // first plane
+                    {
+                        cmd.DW12.SourceCompressionFormat = srcCompressionFormat & 0x0F;
+                    }
+                    else  // second or third
+                    {
+                        cmd.DW12.SourceCompressionFormat = srcCompressionFormat | 0x10;
+                    }
+                }
+            }
+        }
         cmd.DW1.DestinationTiling = GetFastTilingMode(dstTiledMode);
         cmd.DW8.SourceTiling      = GetFastTilingMode(srcTiledMode);
         cmd.DW8.SourceMocs =
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/hw/mhw_mi_xe_lpm_plus_base_next_impl.h b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/hw/mhw_mi_xe_lpm_plus_base_next_impl.h
index cfc5ecf..b338b39 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/hw/mhw_mi_xe_lpm_plus_base_next_impl.h
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/hw/mhw_mi_xe_lpm_plus_base_next_impl.h
@@ -140,6 +140,12 @@
         case MHW_MMIO_CCS0_AUX_TABLE_INVALIDATE:
             mmioRegisters = M_MMIO_CCS0_AUX_TABLE_INVALIDATE;
             break;
+        case MHW_MMIO_BLT_AUX_TABLE_BASE_LOW:
+            mmioRegisters = M_MMIO_BLT_AUX_TABLE_BASE_LOW;
+            break;
+        case MHW_MMIO_BLT_AUX_TABLE_BASE_HIGH:
+            mmioRegisters = M_MMIO_BLT_AUX_TABLE_BASE_HIGH;
+            break;
         default:
             MHW_ASSERTMESSAGE("Invalid mmio data provided");;
             break;
@@ -1026,7 +1032,35 @@
         return MOS_STATUS_SUCCESS;
     }
 
-MEDIA_CLASS_DEFINE_END(mhw__mi__xe_lpm_plus_base_next__Impl)
+    MOS_STATUS AddBLTMMIOPrologCmd(
+        PMOS_COMMAND_BUFFER cmdBuffer) override
+    {
+        MOS_STATUS eStatus          = MOS_STATUS_SUCCESS;
+        uint64_t   auxTableBaseAddr = 0;
+
+        MHW_CHK_NULL_RETURN(cmdBuffer);
+        MHW_CHK_NULL_RETURN(this->m_osItf);
+
+        auxTableBaseAddr = this->m_osItf->pfnGetAuxTableBaseAddr(this->m_osItf);
+
+        if (auxTableBaseAddr)
+        {
+            auto &par      = MHW_GETPAR_F(MI_LOAD_REGISTER_IMM)();
+            par            = {};
+            par.dwData     = (auxTableBaseAddr & 0xffffffff);
+            par.dwRegister = GetMmioInterfaces(mhw::mi::MHW_MMIO_BLT_AUX_TABLE_BASE_LOW);
+            MHW_ADDCMD_F(MI_LOAD_REGISTER_IMM)
+            (cmdBuffer);
+
+            par.dwData     = ((auxTableBaseAddr >> 32) & 0xffffffff);
+            par.dwRegister = GetMmioInterfaces(mhw::mi::MHW_MMIO_BLT_AUX_TABLE_BASE_HIGH);
+            MHW_ADDCMD_F(MI_LOAD_REGISTER_IMM)
+            (cmdBuffer);
+        }
+
+        return eStatus;
+    }
+    MEDIA_CLASS_DEFINE_END(mhw__mi__xe_lpm_plus_base_next__Impl)
 };
 
 }  // namespace xe_lpm_plus_base
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/hw/mhw_vebox_xe_lpm_plus_base_next_impl.h b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/hw/mhw_vebox_xe_lpm_plus_base_next_impl.h
index f073466..8c6a90f 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/hw/mhw_vebox_xe_lpm_plus_base_next_impl.h
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/hw/mhw_vebox_xe_lpm_plus_base_next_impl.h
@@ -3363,6 +3363,7 @@
         uint32_t                               uiInstanceBaseAddr = 0;
         MHW_RESOURCE_PARAMS                    ResourceParams = {};
         MOS_ALLOC_GFXRES_PARAMS                AllocParamsForBufferLinear = {};
+        uint32_t                               *pIndirectState            = nullptr;
 
         MHW_CHK_NULL_RETURN(this->m_osItf);
         MHW_CHK_NULL_RETURN(this->m_osItf->pOsContext);
@@ -3411,7 +3412,19 @@
                 pOsInterface,
                 this->m_currentCmdBuf,
                 &ResourceParams));
-
+#if MOS_COMMAND_BUFFER_DUMP_SUPPORTED
+            if (*ResourceParams.pdwCmd != 0 || *(ResourceParams.pdwCmd + 1) != 0)
+            {
+                // add DNDI indirect state dump
+                pIndirectState = (uint32_t *)(pVeboxHeap->pLockedDriverResourceMem + ResourceParams.dwOffset);
+                pOsInterface->pfnAddIndirectState(pOsInterface,
+                    sizeof(mhw::vebox::xe_lpm_plus_next::Cmd::VEBOX_DNDI_STATE_CMD),
+                    pIndirectState,
+                    ResourceParams.pdwCmd,
+                    ResourceParams.pdwCmd + 1,
+                    "VEBOX_DNDI_STATE_CMD");
+            }
+#endif
             HalOcaInterfaceNext::OnIndirectState(*this->m_currentCmdBuf, (MOS_CONTEXT_HANDLE)pOsContext, ResourceParams.presResource, ResourceParams.dwOffset, false, m_veboxSettings.uiDndiStateSize);
 
             MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams));
@@ -3434,7 +3447,19 @@
                 pOsInterface,
                 this->m_currentCmdBuf,
                 &ResourceParams));
-
+#if MOS_COMMAND_BUFFER_DUMP_SUPPORTED
+            if (*ResourceParams.pdwCmd != 0 || *(ResourceParams.pdwCmd + 1) != 0)
+            {
+                // add IECP indirect state dump
+                pIndirectState = (uint32_t *)(pVeboxHeap->pLockedDriverResourceMem + ResourceParams.dwOffset);
+                pOsInterface->pfnAddIndirectState(pOsInterface,
+                    sizeof(mhw::vebox::xe_lpm_plus_next::Cmd::VEBOX_IECP_STATE_CMD),
+                    pIndirectState,
+                    ResourceParams.pdwCmd,
+                    ResourceParams.pdwCmd + 1,
+                    "VEBOX_IECP_STATE_CMD");
+            }
+#endif
             HalOcaInterfaceNext::OnIndirectState(*this->m_currentCmdBuf, (MOS_CONTEXT_HANDLE)pOsContext, ResourceParams.presResource, ResourceParams.dwOffset, false, m_veboxSettings.uiIecpStateSize);
 
             // Gamut Expansion, HDR and Forward Gamma Correction are mutually exclusive.
@@ -3461,7 +3486,19 @@
                     pOsInterface,
                     this->m_currentCmdBuf,
                     &ResourceParams));
-
+#if MOS_COMMAND_BUFFER_DUMP_SUPPORTED
+                if (*ResourceParams.pdwCmd != 0 || *(ResourceParams.pdwCmd + 1) != 0)
+                {
+                    // add HDR indirect state dump
+                    pIndirectState = (uint32_t *)(pVeboxHeap->pLockedDriverResourceMem + ResourceParams.dwOffset);
+                    pOsInterface->pfnAddIndirectState(pOsInterface,
+                        sizeof(mhw::vebox::xe_lpm_plus_next::Cmd::VEBOX_HDR_STATE_CMD),
+                        pIndirectState,
+                        ResourceParams.pdwCmd,
+                        ResourceParams.pdwCmd + 1,
+                        "VEBOX_HDR_STATE_CMD");
+                }
+#endif
                 HalOcaInterfaceNext::OnIndirectState(*this->m_currentCmdBuf, (MOS_CONTEXT_HANDLE)pOsContext, ResourceParams.presResource, ResourceParams.dwOffset, false, m_veboxSettings.uiHdrStateSize);
             }
             else
@@ -3487,6 +3524,19 @@
                     pOsInterface,
                     this->m_currentCmdBuf,
                     &ResourceParams));
+#if MOS_COMMAND_BUFFER_DUMP_SUPPORTED
+                if (*ResourceParams.pdwCmd != 0 || *(ResourceParams.pdwCmd + 1) != 0)
+                {
+                    // add Gamut Expansion Gamma Correctionindirect state dump
+                    pIndirectState = (uint32_t *)(pVeboxHeap->pLockedDriverResourceMem + ResourceParams.dwOffset);
+                    pOsInterface->pfnAddIndirectState(pOsInterface,
+                        sizeof(mhw::vebox::xe_lpm_plus_next::Cmd::Gamut_Expansion_Gamma_Correction_CMD),
+                        pIndirectState,
+                        ResourceParams.pdwCmd,
+                        ResourceParams.pdwCmd + 1,
+                        "Gamut_Expansion_Gamma_Correction_CMD");
+                }
+#endif
 
                 HalOcaInterfaceNext::OnIndirectState(*this->m_currentCmdBuf, (MOS_CONTEXT_HANDLE)pOsContext, ResourceParams.presResource, ResourceParams.dwOffset, false, m_veboxSettings.uiGamutStateSize);
             }
@@ -3511,7 +3561,19 @@
                 pOsInterface,
                 this->m_currentCmdBuf,
                 &ResourceParams));
-
+#if MOS_COMMAND_BUFFER_DUMP_SUPPORTED
+            if (*ResourceParams.pdwCmd != 0 || *(ResourceParams.pdwCmd + 1) != 0)
+            {
+                // add Vertex Table state dump
+                pIndirectState = (uint32_t *)(pVeboxHeap->pLockedDriverResourceMem + ResourceParams.dwOffset);
+                pOsInterface->pfnAddIndirectState(pOsInterface,
+                    sizeof(mhw::vebox::xe_lpm_plus_next::Cmd::VEBOX_VERTEX_TABLE_CMD),
+                    pIndirectState,
+                    ResourceParams.pdwCmd,
+                    ResourceParams.pdwCmd + 1,
+                    "VEBOX_VERTEX_TABLE_CMD");
+            }
+#endif
             HalOcaInterfaceNext::OnIndirectState(*this->m_currentCmdBuf, (MOS_CONTEXT_HANDLE)pOsContext, ResourceParams.presResource, ResourceParams.dwOffset, false, m_veboxSettings.uiVertexTableSize);
 
             MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams));
@@ -3535,7 +3597,19 @@
                 pOsInterface,
                 this->m_currentCmdBuf,
                 &ResourceParams));
-
+#if MOS_COMMAND_BUFFER_DUMP_SUPPORTED
+            if (*ResourceParams.pdwCmd != 0 || *(ResourceParams.pdwCmd + 1) != 0)
+            {
+                // add CAPTURE PIPE STATE CMD state dump
+                pIndirectState = (uint32_t *)(pVeboxHeap->pLockedDriverResourceMem + ResourceParams.dwOffset);
+                pOsInterface->pfnAddIndirectState(pOsInterface,
+                    sizeof(mhw::vebox::xe_lpm_plus_next::Cmd::VEBOX_CAPTURE_PIPE_STATE_CMD),
+                    pIndirectState,
+                    ResourceParams.pdwCmd,
+                    ResourceParams.pdwCmd + 1,
+                    "VEBOX_CAPTURE_PIPE_STATE_CMD");
+            }
+#endif
             HalOcaInterfaceNext::OnIndirectState(*this->m_currentCmdBuf, (MOS_CONTEXT_HANDLE)pOsContext, ResourceParams.presResource, ResourceParams.dwOffset, false, m_veboxSettings.uiCapturePipeStateSize);
 
             if (params.pLaceLookUpTables)
@@ -3574,6 +3648,19 @@
                 pOsInterface,
                 this->m_currentCmdBuf,
                 &ResourceParams));
+#if MOS_COMMAND_BUFFER_DUMP_SUPPORTED
+            if (*ResourceParams.pdwCmd != 0 || *(ResourceParams.pdwCmd + 1) != 0)
+            {
+                // add Gamma Correction state dump
+                pIndirectState = (uint32_t *)(pVeboxHeap->pLockedDriverResourceMem + ResourceParams.dwOffset);
+                pOsInterface->pfnAddIndirectState(pOsInterface,
+                    sizeof(PMHW_FORWARD_GAMMA_SEG),
+                    pIndirectState,
+                    ResourceParams.pdwCmd,
+                    ResourceParams.pdwCmd + 1,
+                    "PMHW_FORWARD_GAMMA_SEG");
+            }
+#endif
 
             HalOcaInterfaceNext::OnIndirectState(*this->m_currentCmdBuf, (MOS_CONTEXT_HANDLE)pOsContext, ResourceParams.presResource, ResourceParams.dwOffset, false, m_veboxSettings.uiGammaCorrectionStateSize);
 
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediaDecompress/media_mem_decompress_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediaDecompress/media_mem_decompress_xe_lpm_plus_base.cpp
index 8faf415..5bdceae 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediaDecompress/media_mem_decompress_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediaDecompress/media_mem_decompress_xe_lpm_plus_base.cpp
@@ -218,12 +218,14 @@
         customValue,
         true);
 
+#if (LINUX || _DEBUG || _RELEASE_INTERNAL)
     // Read multi processes single binary flag
     ReadUserSetting(
         m_userSettingPtr,
         m_multiprocesssinglebin,
         __MEDIA_USER_FEATURE_VALUE_PERF_PROFILER_MUL_PROC_SINGLE_BIN,
         MediaUserSetting::Group::Device);
+#endif
 
     return eStatus;
 }
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 9a2a4ad..3760e63 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
@@ -65,7 +65,6 @@
 {
     BltStateNext::Initialize();
     initialized = true;
-    m_blokCopyon = true;
     return MOS_STATUS_SUCCESS;
 }
 
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediacopy/media_copy_xe_lpm_plus_base.cpp b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediacopy/media_copy_xe_lpm_plus_base.cpp
index bc13537..6c2bec9 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediacopy/media_copy_xe_lpm_plus_base.cpp
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediacopy/media_copy_xe_lpm_plus_base.cpp
@@ -193,7 +193,7 @@
 
     if (m_veboxCopyState)
     {
-        supported = m_veboxCopyState->IsFormatSupported(src) && m_veboxCopyState->IsFormatSupported(dst);
+        supported = m_veboxCopyState->IsSurfaceSupported(src) && m_veboxCopyState->IsSurfaceSupported(dst);
     }
 
     if (src->TileType == MOS_TILE_LINEAR &&
@@ -204,3 +204,13 @@
 
     return supported;
 }
+
+MOS_STATUS MediaCopyStateXe_Lpm_Plus_Base::CopyEnigneSelect(MCPY_METHOD &preferMethod, MCPY_ENGINE &mcpyEngine, MCPY_ENGINE_CAPS &caps)
+{
+    if (preferMethod == MCPY_METHOD_DEFAULT)
+    {
+        preferMethod = MCPY_METHOD_PERFORMANCE;
+    }
+    MediaCopyBaseState::CopyEnigneSelect(preferMethod, mcpyEngine, caps);
+    return MOS_STATUS_SUCCESS;
+}
\ No newline at end of file
diff --git a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediacopy/media_copy_xe_lpm_plus_base.h b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediacopy/media_copy_xe_lpm_plus_base.h
index 5775a81..f48a272 100644
--- a/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediacopy/media_copy_xe_lpm_plus_base.h
+++ b/media_softlet/agnostic/Xe_M_plus/Xe_LPM_plus_base/shared/mediacopy/media_copy_xe_lpm_plus_base.h
@@ -123,7 +123,30 @@
     //!
     virtual MOS_STATUS MediaVeboxCopy(PMOS_RESOURCE src, PMOS_RESOURCE dst);
 
+    //!
+    //! \brief    vebox format support.
+    //! \details  surface format support.
+    //! \param    src
+    //!           [in] Pointer to source surface
+    //! \param    dst
+    //!           [in] Pointer to destination surface
+    //! \return   bool
+    //!           Return true if support, otherwise return false.
+    //!
     virtual bool IsVeboxCopySupported(PMOS_RESOURCE src, PMOS_RESOURCE dst);
+    //!
+    //! \brief    select copy enigne
+    //! \details  media copy select copy enigne.
+    //! \param    preferMethod
+    //!           [in] copy method
+    //! \param    mcpyEngine
+    //!           [in] copy engine
+    //! \param    caps
+    //!           [in] reference of featue supported engine
+    //! \return   MOS_STATUS
+    //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
+    //!
+    virtual MOS_STATUS CopyEnigneSelect(MCPY_METHOD &preferMethod, MCPY_ENGINE &mcpyEngine, MCPY_ENGINE_CAPS &caps);
 
     MhwInterfacesNext                  *m_mhwInterfaces  = nullptr;
     RenderCopyXe_LPM_Plus_Base         *m_renderCopy     = nullptr;
diff --git a/media_softlet/agnostic/common/codec/hal/codechal_common.cpp b/media_softlet/agnostic/common/codec/hal/codechal_common.cpp
index bef2d51..9d857f5 100644
--- a/media_softlet/agnostic/common/codec/hal/codechal_common.cpp
+++ b/media_softlet/agnostic/common/codec/hal/codechal_common.cpp
@@ -165,6 +165,12 @@
     return MOS_STATUS_SUCCESS;
 }
 
+MOS_STATUS Codechal::Reformat()
+{
+    CODECHAL_PUBLIC_FUNCTION_ENTER;
+    return MOS_STATUS_SUCCESS;
+}
+
 MOS_STATUS Codechal::Execute(void *params)
 {
     CODECHAL_PUBLIC_FUNCTION_ENTER;
diff --git a/media_softlet/agnostic/common/codec/hal/codechal_common.h b/media_softlet/agnostic/common/codec/hal/codechal_common.h
index 8fe8787..ce57950 100644
--- a/media_softlet/agnostic/common/codec/hal/codechal_common.h
+++ b/media_softlet/agnostic/common/codec/hal/codechal_common.h
@@ -270,6 +270,8 @@
     //!
     virtual MOS_STATUS EndFrame();
 
+    virtual MOS_STATUS Reformat();
+
     //!
     //! \brief    Performs the operation requested by the codec function.
     //! \param    [in] params
diff --git a/media_softlet/agnostic/common/codec/hal/codechal_debug.cpp b/media_softlet/agnostic/common/codec/hal/codechal_debug.cpp
index f3c5dc0..32ffcf8 100644
--- a/media_softlet/agnostic/common/codec/hal/codechal_debug.cpp
+++ b/media_softlet/agnostic/common/codec/hal/codechal_debug.cpp
@@ -2289,6 +2289,8 @@
         const char *fileName;
         bool        binaryDump = false;
         if ((!strcmp(attrName, MediaDbgAttr::attrDecodeBitstream)) ||
+            (!strcmp(attrName, MediaDbgAttr::attrStreamIn)) ||
+            (!strcmp(attrName, MediaDbgAttr::attrStreamOut)) ||
             (!strcmp(attrName, MediaDbgAttr::attrMvData)) ||
             (!strcmp(attrName, MediaDbgAttr::attrSegId)) ||
             (!strcmp(attrName, MediaDbgAttr::attrCoefProb)) ||
@@ -2419,6 +2421,8 @@
         const char *fileName;
         bool        binaryDump = false;
         if ((!strcmp(attrName, MediaDbgAttr::attrDecodeBitstream)) ||
+            (!strcmp(attrName, MediaDbgAttr::attrStreamIn)) ||
+            (!strcmp(attrName, MediaDbgAttr::attrStreamOut)) ||
             (!strcmp(attrName, MediaDbgAttr::attrMvData)) ||
             (!strcmp(attrName, MediaDbgAttr::attrSegId)) ||
             (!strcmp(attrName, MediaDbgAttr::attrCoefProb)) ||
@@ -3792,7 +3796,7 @@
         }
         CODECHAL_DEBUG_CHK_NULL(data);
 
-        if (DumpIsEnabled(MediaDbgAttr::attrEnableFastDump))
+        if (DumpIsEnabled(MediaDbgAttr::attrEnableFastDump) && MediaDebugFastDump::IsGood())
         {
             MediaDebugFastDump::Dump(
                 data + batchBuffer->dwOffset,
@@ -3823,7 +3827,7 @@
 
         batchBuffer->pData += batchBuffer->dwOffset;
 
-        if (DumpIsEnabled(MediaDbgAttr::attrEnableFastDump))
+        if (DumpIsEnabled(MediaDbgAttr::attrEnableFastDump) && MediaDebugFastDump::IsGood())
         {
             MediaDebugFastDump::Dump(
                 batchBuffer->pData,
diff --git a/media_softlet/agnostic/common/codec/hal/dec/av1/features/decode_av1_basic_feature.cpp b/media_softlet/agnostic/common/codec/hal/dec/av1/features/decode_av1_basic_feature.cpp
index a29df79..344630a 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/av1/features/decode_av1_basic_feature.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/av1/features/decode_av1_basic_feature.cpp
@@ -32,20 +32,23 @@
 {
     Av1BasicFeature::~Av1BasicFeature()
     {
-        for (uint8_t i = 0; i < av1DefaultCdfTableNum; i++)
+        if (m_allocator)
         {
-            if (!m_allocator->ResourceIsNull(&m_defaultCdfBuffers[i]->OsResource))
+            for (uint8_t i = 0; i < av1DefaultCdfTableNum; i++)
             {
-                m_allocator->Destroy(m_defaultCdfBuffers[i]);
+                if (!m_allocator->ResourceIsNull(&m_defaultCdfBuffers[i]->OsResource))
+                {
+                    m_allocator->Destroy(m_defaultCdfBuffers[i]);
+                }
             }
-        }
-        if (m_usingDummyWl == true)
-        {
-            m_allocator->Destroy(m_destSurfaceForDummyWL);
-        }
-        if (m_fgInternalSurf != nullptr && !m_allocator->ResourceIsNull(&m_fgInternalSurf->OsResource))
-        {
-            m_allocator->Destroy(m_fgInternalSurf);
+            if (m_usingDummyWl == true)
+            {
+                m_allocator->Destroy(m_destSurfaceForDummyWL);
+            }
+            if (m_fgInternalSurf != nullptr && !m_allocator->ResourceIsNull(&m_fgInternalSurf->OsResource))
+            {
+                m_allocator->Destroy(m_fgInternalSurf);
+            }
         }
     }
 
diff --git a/media_softlet/agnostic/common/codec/hal/dec/av1/features/decode_av1_temporal_buffers.cpp b/media_softlet/agnostic/common/codec/hal/dec/av1/features/decode_av1_temporal_buffers.cpp
index 9f414b8..a4197fe 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/av1/features/decode_av1_temporal_buffers.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/av1/features/decode_av1_temporal_buffers.cpp
@@ -220,7 +220,7 @@
     {
         DECODE_FUNC_CALL();
 
-        if (buffer != nullptr)
+        if (buffer != nullptr && m_allocator != nullptr)
         {
             m_allocator->Destroy(buffer->mvBuf);
 
diff --git a/media_softlet/agnostic/common/codec/hal/dec/av1/packet/decode_av1_packet.cpp b/media_softlet/agnostic/common/codec/hal/dec/av1/packet/decode_av1_packet.cpp
index f8eedfe..f6e4399 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/av1/packet/decode_av1_packet.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/av1/packet/decode_av1_packet.cpp
@@ -80,8 +80,10 @@
 MOS_STATUS Av1DecodePkt::Destroy()
 {
     m_statusReport->UnregistObserver(this);
-
-    DECODE_CHK_STATUS(m_allocator->Destroy(m_secondLevelBBArray));
+    if (m_allocator != nullptr)
+    {
+        DECODE_CHK_STATUS(m_allocator->Destroy(m_secondLevelBBArray));
+    }
 
     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 7bb4e97..7c3e773 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
@@ -32,7 +32,7 @@
 
     AvcBasicFeature::~AvcBasicFeature()
     {
-        if (m_resMonoPicChromaBuffer != nullptr)
+        if (m_allocator != nullptr && m_resMonoPicChromaBuffer != nullptr)
         {
             m_allocator->Destroy(m_resMonoPicChromaBuffer);
         }
diff --git a/media_softlet/agnostic/common/codec/hal/dec/avc/features/decode_avc_mv_buffers.cpp b/media_softlet/agnostic/common/codec/hal/dec/avc/features/decode_avc_mv_buffers.cpp
index e59466a..33d0bc0 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/avc/features/decode_avc_mv_buffers.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/avc/features/decode_avc_mv_buffers.cpp
@@ -70,7 +70,11 @@
 void AvcMvBufferOpInf::Destroy(MOS_BUFFER* &buffer)
 {
     DECODE_FUNC_CALL();
-    m_allocator->Destroy(buffer);
+
+    if (m_allocator != nullptr)
+    {
+        m_allocator->Destroy(buffer);
+    }
 }
 
 }  // namespace decode
diff --git a/media_softlet/agnostic/common/codec/hal/dec/avc/packet/decode_avc_picture_packet.cpp b/media_softlet/agnostic/common/codec/hal/dec/avc/packet/decode_avc_picture_packet.cpp
index 88ed0bb..8cdc05e 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/avc/packet/decode_avc_picture_packet.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/avc/packet/decode_avc_picture_packet.cpp
@@ -646,26 +646,20 @@
                 CodechalDbgAttr::attrDecodeReferenceSurfaces,
                 refSurfName.c_str()));
 
-            if (&mvParam.presAvcDmvBuffers[n+1] != nullptr)
-            {
-                std::string mvBufDumpName = "_DEC_Ref_MV_" + std::to_string(n);
-                DECODE_CHK_STATUS(debugInterface->DumpBuffer(
-                    &mvParam.presAvcDmvBuffers[n+1],
-                    CodechalDbgAttr::attrMvData,
-                    mvBufDumpName.c_str(),
-                    mvBufferSize));
-            }
+            std::string mvBufDumpName = "_DEC_Ref_MV_" + std::to_string(n);
+            DECODE_CHK_STATUS(debugInterface->DumpBuffer(
+                &mvParam.presAvcDmvBuffers[n+1],
+                CodechalDbgAttr::attrMvData,
+                mvBufDumpName.c_str(),
+                mvBufferSize));
         }
     }
 
-    if (&mvParam.presAvcDmvBuffers[0] != nullptr)
-    {
-        DECODE_CHK_STATUS(debugInterface->DumpBuffer(
-            &mvParam.presAvcDmvBuffers[0],
-            CodechalDbgAttr::attrMvData,
-            "DEC_Cur_MV_",
-            mvBufferSize));
-    }
+    DECODE_CHK_STATUS(debugInterface->DumpBuffer(
+        &mvParam.presAvcDmvBuffers[0],
+        CodechalDbgAttr::attrMvData,
+        "DEC_Cur_MV_",
+        mvBufferSize));
 
     return MOS_STATUS_SUCCESS;
 }
@@ -699,4 +693,4 @@
     return MOS_STATUS_SUCCESS;
 }
 
-}  // namespace decode
\ No newline at end of file
+}  // namespace decode
diff --git a/media_softlet/agnostic/common/codec/hal/dec/hevc/features/decode_hevc_basic_feature.cpp b/media_softlet/agnostic/common/codec/hal/dec/hevc/features/decode_hevc_basic_feature.cpp
index 50ecf98..d28732e 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/hevc/features/decode_hevc_basic_feature.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/hevc/features/decode_hevc_basic_feature.cpp
@@ -52,7 +52,10 @@
 
 HevcBasicFeature::~HevcBasicFeature()
 {
-    m_allocator->Destroy(m_referenceBeforeLoopFilter);
+    if (m_allocator != nullptr)
+    {
+        m_allocator->Destroy(m_referenceBeforeLoopFilter);
+    }
 }
 
 MOS_STATUS HevcBasicFeature::Update(void *params)
diff --git a/media_softlet/agnostic/common/codec/hal/dec/hevc/features/decode_hevc_mv_buffers.cpp b/media_softlet/agnostic/common/codec/hal/dec/hevc/features/decode_hevc_mv_buffers.cpp
index f2872f4..206d5f3 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/hevc/features/decode_hevc_mv_buffers.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/hevc/features/decode_hevc_mv_buffers.cpp
@@ -75,7 +75,11 @@
 void HevcMvBufferOpInf::Destroy(MOS_BUFFER* &buffer)
 {
     DECODE_FUNC_CALL();
-    m_allocator->Destroy(buffer);
+
+    if (m_allocator != nullptr)
+    {
+        m_allocator->Destroy(buffer);
+    }
 }
 
 }  // namespace decode
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 08e34c4..fce9792 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
@@ -84,7 +84,10 @@
     {
         DECODE_FUNC_CALL();
 
-        DECODE_CHK_STATUS(m_allocator->Destroy(m_s2lControlTempMVRegionBuffer));
+        if (m_allocator != nullptr)
+        {
+            DECODE_CHK_STATUS(m_allocator->Destroy(m_s2lControlTempMVRegionBuffer));
+        }
 
         return MOS_STATUS_SUCCESS;
     }
diff --git a/media_softlet/agnostic/common/codec/hal/dec/hevc/pipeline/decode_hevc_pipeline.cpp b/media_softlet/agnostic/common/codec/hal/dec/hevc/pipeline/decode_hevc_pipeline.cpp
index 12fddd4..905e121 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/hevc/pipeline/decode_hevc_pipeline.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/hevc/pipeline/decode_hevc_pipeline.cpp
@@ -504,7 +504,7 @@
             if (shortFormatInUse)
             {
                 PCODEC_HEVC_SF_SLICE_PARAMS slcParamsSF =
-                    (PCODEC_HEVC_SF_SLICE_PARAMS)MOS_AllocMemory(sizeof(PCODEC_HEVC_SF_SLICE_PARAMS) * numSlices);
+                    (PCODEC_HEVC_SF_SLICE_PARAMS)MOS_AllocMemory(sizeof(CODEC_HEVC_SF_SLICE_PARAMS) * numSlices);
 
                 for (uint16_t i = 0; i < numSlices; i++)
                 {
diff --git a/media_softlet/agnostic/common/codec/hal/dec/mpeg2/features/decode_mpeg2_basic_feature.cpp b/media_softlet/agnostic/common/codec/hal/dec/mpeg2/features/decode_mpeg2_basic_feature.cpp
index 192823f..3dfd221 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/mpeg2/features/decode_mpeg2_basic_feature.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/mpeg2/features/decode_mpeg2_basic_feature.cpp
@@ -33,12 +33,15 @@
 
 Mpeg2BasicFeature::~Mpeg2BasicFeature()
 {
-    if (m_resMpeg2DummyBistream != nullptr)
+    if (m_allocator != nullptr)
     {
-        m_allocator->Destroy(m_resMpeg2DummyBistream);
-    }
+        if (m_resMpeg2DummyBistream != nullptr)
+        {
+            m_allocator->Destroy(m_resMpeg2DummyBistream);
+        }
 
-    m_allocator->Destroy(m_copiedDataBufArray);
+        m_allocator->Destroy(m_copiedDataBufArray);
+    }
 }
 
 MOS_STATUS Mpeg2BasicFeature::Init(void *setting)
diff --git a/media_softlet/agnostic/common/codec/hal/dec/mpeg2/packet/decode_mpeg2_packet.cpp b/media_softlet/agnostic/common/codec/hal/dec/mpeg2/packet/decode_mpeg2_packet.cpp
index 0098f40..cd7d154 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/mpeg2/packet/decode_mpeg2_packet.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/mpeg2/packet/decode_mpeg2_packet.cpp
@@ -97,7 +97,10 @@
 MOS_STATUS Mpeg2DecodePkt::Destroy()
 {
     m_statusReport->UnregistObserver(this);
-    DECODE_CHK_STATUS(m_allocator->Destroy(m_secondLevelBBArray));
+    if (m_allocator != nullptr)
+    {
+        DECODE_CHK_STATUS(m_allocator->Destroy(m_secondLevelBBArray));
+    }
 
     return MOS_STATUS_SUCCESS;
 }
diff --git a/media_softlet/agnostic/common/codec/hal/dec/shared/bufferMgr/decode_internal_target.h b/media_softlet/agnostic/common/codec/hal/dec/shared/bufferMgr/decode_internal_target.h
index fc169fd..8a8a77f 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/shared/bufferMgr/decode_internal_target.h
+++ b/media_softlet/agnostic/common/codec/hal/dec/shared/bufferMgr/decode_internal_target.h
@@ -48,15 +48,18 @@
     {
         DECODE_FUNC_CALL();
 
-        for (auto& surface : m_activeSurfaces)
+        if (m_allocator != nullptr)
         {
-            m_allocator->Destroy(surface.second);
-        }
-        m_activeSurfaces.clear();
+            for (auto &surface : m_activeSurfaces)
+            {
+                m_allocator->Destroy(surface.second);
+            }
+            m_activeSurfaces.clear();
 
-        for (auto& surface : m_aviableSurfaces)
-        {
-            m_allocator->Destroy(surface);
+            for (auto &surface : m_aviableSurfaces)
+            {
+                m_allocator->Destroy(surface);
+            }
         }
         m_aviableSurfaces.clear();
     }
diff --git a/media_softlet/agnostic/common/codec/hal/dec/shared/bufferMgr/decode_resource_array.h b/media_softlet/agnostic/common/codec/hal/dec/shared/bufferMgr/decode_resource_array.h
index f966334..3ab1521 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/shared/bufferMgr/decode_resource_array.h
+++ b/media_softlet/agnostic/common/codec/hal/dec/shared/bufferMgr/decode_resource_array.h
@@ -157,7 +157,10 @@
             {
                 continue;
             }
-            DECODE_CHK_STATUS(m_allocator->Destroy(resource));
+            if (m_allocator != nullptr)
+            {
+                DECODE_CHK_STATUS(m_allocator->Destroy(resource));
+            }
         }
 
         m_resourceQueue.clear();
diff --git a/media_softlet/agnostic/common/codec/hal/dec/shared/features/decode_basic_feature.cpp b/media_softlet/agnostic/common/codec/hal/dec/shared/features/decode_basic_feature.cpp
index 02ec676..04a186b 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/shared/features/decode_basic_feature.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/shared/features/decode_basic_feature.cpp
@@ -51,7 +51,7 @@
 
 DecodeBasicFeature::~DecodeBasicFeature()
 {
-    if (m_dummyReferenceStatus == CODECHAL_DUMMY_REFERENCE_ALLOCATED)
+    if (m_allocator != nullptr && m_dummyReferenceStatus == CODECHAL_DUMMY_REFERENCE_ALLOCATED)
     {
         m_allocator->Destroy(m_dummyReference);
     }
diff --git a/media_softlet/agnostic/common/codec/hal/dec/shared/features/decode_downsampling_feature.cpp b/media_softlet/agnostic/common/codec/hal/dec/shared/features/decode_downsampling_feature.cpp
index 29d8f81..90c0ee2 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/shared/features/decode_downsampling_feature.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/shared/features/decode_downsampling_feature.cpp
@@ -43,18 +43,21 @@
 
 DecodeDownSamplingFeature::~DecodeDownSamplingFeature()
 {
-    for (auto i = 0; i < DecodeBasicFeature::m_maxFrameIndex; i++)
+    if (m_allocator != nullptr)
     {
-        MOS_BUFFER *histogramBuffer = m_histogramBufferList[i];
-        if (histogramBuffer == nullptr ||
-            m_allocator->ResourceIsNull(&histogramBuffer->OsResource))
+        for (auto i = 0; i < DecodeBasicFeature::m_maxFrameIndex; i++)
         {
-            continue;
-        }
-        MOS_STATUS eStatus = m_allocator->Destroy(m_histogramBuffer);
-        if (eStatus != MOS_STATUS_SUCCESS)
-        {
-            DECODE_ASSERTMESSAGE("Failed to free histogram internal buffer!");
+            MOS_BUFFER *histogramBuffer = m_histogramBufferList[i];
+            if (histogramBuffer == nullptr ||
+                m_allocator->ResourceIsNull(&histogramBuffer->OsResource))
+            {
+                continue;
+            }
+            MOS_STATUS eStatus = m_allocator->Destroy(m_histogramBuffer);
+            if (eStatus != MOS_STATUS_SUCCESS)
+            {
+                DECODE_ASSERTMESSAGE("Failed to free histogram internal buffer!");
+            }
         }
     }
 }
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 a43caa8..31b1cb2 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
@@ -414,15 +414,20 @@
 }
 #endif
 
-MOS_STATUS DecodePipeline::DumpBitstream(PMOS_RESOURCE pBitstream, uint32_t size, uint32_t offset)
+MOS_STATUS DecodePipeline::DumpBitstream(PMOS_RESOURCE pBitstream, uint32_t size, uint32_t offset, const char* attrName)
 {
     DECODE_FUNC_CALL();
 
     DECODE_CHK_NULL(pBitstream);
 
+    if(attrName == nullptr)
+    {
+        attrName = CodechalDbgAttr::attrDecodeBitstream;
+    }
+
     DECODE_CHK_STATUS(m_debugInterface->DumpBuffer(
         pBitstream, 
-        CodechalDbgAttr::attrDecodeBitstream,
+        attrName,
         "_DEC", 
         size, 
         offset, 
@@ -492,6 +497,11 @@
             &dstSurface, CodechalDbgAttr::attrDecodeOutputSurface, "DstSurf"));
     }
 
+    if(m_streamout != nullptr)
+    {
+        m_streamout->DumpOutput(reportData);
+    }
+
 #ifdef _DECODE_PROCESSING_SUPPORTED
     DecodeDownSamplingFeature* downSamplingFeature = dynamic_cast<DecodeDownSamplingFeature*>(
         m_featureManager->GetFeature(DecodeFeatureIDs::decodeDownSampling));
diff --git a/media_softlet/agnostic/common/codec/hal/dec/shared/pipeline/decode_pipeline.h b/media_softlet/agnostic/common/codec/hal/dec/shared/pipeline/decode_pipeline.h
index a0b0e74..9a97ae2 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/shared/pipeline/decode_pipeline.h
+++ b/media_softlet/agnostic/common/codec/hal/dec/shared/pipeline/decode_pipeline.h
@@ -411,10 +411,12 @@
     //!         Bitstream Size
     //! \param  [in] offset
     //!         Bitstream Offset 
+    //! \param  [in] attrName
+    //!         Bitstream Name
     //! \return MOS_STATUS
     //!         MOS_STATUS_SUCCESS if success, else fail reason
     //!
-    virtual MOS_STATUS DumpBitstream(PMOS_RESOURCE pBitstream, uint32_t size, uint32_t offset);
+    virtual MOS_STATUS DumpBitstream(PMOS_RESOURCE pBitstream, uint32_t size, uint32_t offset, const char* attrName = nullptr);
 
     //!
     //! \brief  Add delay for dump render targets
@@ -494,6 +496,7 @@
     MOS_STATUS CreateSubPacketManager(CodechalSetting* codecSettings);
 
     friend class DecodeSubPipelineManager;
+    friend class DecodeStreamOut;
 
     CodechalHwInterfaceNext *m_hwInterface        = nullptr;  //!< Codechal HwInterface
     CodechalOcaDumper      *m_pCodechalOcaDumper = nullptr;
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 039f5ee..d882c28 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
@@ -118,6 +118,25 @@
             m_statusReportData[submitIndex].frameType            = inputParameters->pictureCodingType;
             m_statusReportData[submitIndex].secondField          = inputParameters->isSecondField;
             m_statusReportData[submitIndex].currFgOutputPicRes   = inputParameters->fgOutputPicRes;
+            m_statusReportData[submitIndex].streamSize           = inputParameters->streamSize;
+
+            if (inputParameters->streamOutBufRes != nullptr)  
+            {  
+                m_statusReportData[submitIndex].streamOutBufRes = *(inputParameters->streamOutBufRes);  
+            }  
+            else
+            {
+                m_statusReportData[submitIndex].streamOutBufRes = {0};
+            }
+
+            if (inputParameters->streamInBufRes != nullptr)  
+            {  
+                m_statusReportData[submitIndex].streamInBufRes = *(inputParameters->streamInBufRes);
+            }  
+            else
+            {
+                m_statusReportData[submitIndex].streamInBufRes = {0};
+            }
 #endif
         }
 
@@ -270,7 +289,7 @@
     {
         DECODE_FUNC_CALL();
 
-        if (m_statusBufMfx != nullptr)
+        if (m_allocator != nullptr && m_statusBufMfx != nullptr)
         {
             m_allocator->UnLock(m_statusBufMfx);
             m_allocator->Destroy(m_statusBufMfx);
@@ -278,7 +297,7 @@
             m_completedCountBuf = nullptr;
         }
 
-        if (m_statusBufRcs != nullptr)
+        if (m_allocator != nullptr && m_statusBufRcs != nullptr)
         {
             m_allocator->UnLock(m_statusBufRcs);
             m_allocator->Destroy(m_statusBufRcs);
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 e96b1c7..db8176f 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
@@ -71,10 +71,16 @@
         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
         PMOS_RESOURCE           currFgOutputPicRes = nullptr;
-        //! \brief Applies when debug dumps are enabled, stream out buffer
+        //! \brief Applies when debug dumps are enabled, stream out buffer (legacy)
         PMOS_RESOURCE           streamOutBuf = nullptr;
-        //! \brief Applies when debug dumps are enabled, index of the streamout buffer
+        //! \brief Applies when debug dumps are enabled, index of the streamout buffer (legacy)
         uint32_t                streamoutIdx = 0;
+        //! \brief Applies when debug dumps are enabled, stream in buffer
+        MOS_RESOURCE            streamInBufRes = { 0 };
+        //! \brief Applies when debug dumps are enabled, stream out buffer
+        MOS_RESOURCE            streamOutBufRes = { 0 };
+        //! \brief Applies when debug dumps are enabled, stream size
+        uint32_t                streamSize = 0;
         //! \brief Applies when debug dumps are enabled, indicates whether or not this is the final field in the frame.
         bool                    secondField = false;
         //! \brief Applies to VC1 only, indicates whether or not the frame required OLP.
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 9a947a3..ccbae6b 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
@@ -119,6 +119,9 @@
     MOS_SURFACE       *sfcOutputSurface;
     MOS_RESOURCE      *histogramOutputBuf;
     MOS_RESOURCE      *fgOutputPicRes;
+    MOS_RESOURCE      *streamInBufRes;
+    MOS_RESOURCE      *streamOutBufRes;
+    uint32_t           streamSize;
 #endif
 };
 
diff --git a/media_softlet/agnostic/common/codec/hal/dec/vp9/features/decode_vp9_basic_feature.cpp b/media_softlet/agnostic/common/codec/hal/dec/vp9/features/decode_vp9_basic_feature.cpp
index d524515..7bc5dee 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/vp9/features/decode_vp9_basic_feature.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/vp9/features/decode_vp9_basic_feature.cpp
@@ -64,17 +64,20 @@
 
 Vp9BasicFeature::~Vp9BasicFeature()
 {
-    for (uint8_t i = 0; i < CODEC_VP9_NUM_CONTEXTS + 1; i++)
+    if (m_allocator != nullptr)
     {
-        if (!m_allocator->ResourceIsNull(&m_resVp9ProbBuffer[i]->OsResource))
+        for (uint8_t i = 0; i < CODEC_VP9_NUM_CONTEXTS + 1; i++)
         {
-            m_allocator->Destroy(m_resVp9ProbBuffer[i]);
+            if (!m_allocator->ResourceIsNull(&m_resVp9ProbBuffer[i]->OsResource))
+            {
+                m_allocator->Destroy(m_resVp9ProbBuffer[i]);
+            }
         }
-    }
 
-    if (!m_allocator->ResourceIsNull(&m_resVp9SegmentIdBuffer->OsResource))
-    {
-        m_allocator->Destroy(m_resVp9SegmentIdBuffer);
+        if (!m_allocator->ResourceIsNull(&m_resVp9SegmentIdBuffer->OsResource))
+        {
+            m_allocator->Destroy(m_resVp9SegmentIdBuffer);
+        }
     }
 }
 
diff --git a/media_softlet/agnostic/common/codec/hal/dec/vp9/packet/decode_huc_prob_update_packet.cpp b/media_softlet/agnostic/common/codec/hal/dec/vp9/packet/decode_huc_prob_update_packet.cpp
index 9806b3b..a919f37 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/vp9/packet/decode_huc_prob_update_packet.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/vp9/packet/decode_huc_prob_update_packet.cpp
@@ -52,14 +52,17 @@
 
 HucVp9ProbUpdatePkt::~HucVp9ProbUpdatePkt()
 {
-    if (m_probUpdateDmemBufferArray)
+    if (m_allocator != nullptr)
     {
-        m_allocator->Destroy(m_probUpdateDmemBufferArray);
-    }
+        if (m_probUpdateDmemBufferArray)
+        {
+            m_allocator->Destroy(m_probUpdateDmemBufferArray);
+        }
 
-    if (m_interProbSaveBuffer)
-    {
-        m_allocator->Destroy(m_interProbSaveBuffer);
+        if (m_interProbSaveBuffer)
+        {
+            m_allocator->Destroy(m_interProbSaveBuffer);
+        }
     }
 }
 
diff --git a/media_softlet/agnostic/common/codec/hal/dec/vp9/packet/decode_huc_prob_update_packet.h b/media_softlet/agnostic/common/codec/hal/dec/vp9/packet/decode_huc_prob_update_packet.h
index 99ef0c9..9b19e73 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/vp9/packet/decode_huc_prob_update_packet.h
+++ b/media_softlet/agnostic/common/codec/hal/dec/vp9/packet/decode_huc_prob_update_packet.h
@@ -123,10 +123,10 @@
 
     virtual MOS_STATUS Execute(MOS_COMMAND_BUFFER &cmdBuffer, bool prologNeeded) override;
 
-    MOS_STATUS PackPictureLevelCmds(MOS_COMMAND_BUFFER &cmdBuffer);
+    virtual MOS_STATUS PackPictureLevelCmds(MOS_COMMAND_BUFFER &cmdBuffer);
     MOS_STATUS PackSliceLevelCmds(MOS_COMMAND_BUFFER &cmdBuffer);
     MOS_STATUS SetDmemBuffer();
-    MOS_STATUS AddCmd_HUC_IMEM_STATE(MOS_COMMAND_BUFFER &cmdBuffer);
+    virtual MOS_STATUS AddCmd_HUC_IMEM_STATE(MOS_COMMAND_BUFFER &cmdBuffer);
     MOS_STATUS AddCmd_HUC_PIPE_MODE_SELECT(MOS_COMMAND_BUFFER &cmdBuffer);
 
     virtual MHW_SETPAR_DECL_HDR(HUC_DMEM_STATE);
diff --git a/media_softlet/agnostic/common/codec/hal/dec/vp9/pipeline/decode_vp9_buffer_update.cpp b/media_softlet/agnostic/common/codec/hal/dec/vp9/pipeline/decode_vp9_buffer_update.cpp
index c93af13..30720b1 100644
--- a/media_softlet/agnostic/common/codec/hal/dec/vp9/pipeline/decode_vp9_buffer_update.cpp
+++ b/media_softlet/agnostic/common/codec/hal/dec/vp9/pipeline/decode_vp9_buffer_update.cpp
@@ -42,7 +42,10 @@
 
 DecodeVp9BufferUpdate::~DecodeVp9BufferUpdate()
 {
-    m_allocator->Destroy(m_segmentInitBuffer);
+    if (m_allocator != nullptr)
+    {
+        m_allocator->Destroy(m_segmentInitBuffer);
+    }
 }
 
 MOS_STATUS DecodeVp9BufferUpdate::Init(CodechalSetting &settings)
diff --git a/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_basic_feature.cpp b/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_basic_feature.cpp
index 76b22b9..ac85ff2 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_basic_feature.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_basic_feature.cpp
@@ -83,7 +83,9 @@
         outValue,
         "AV1 Encode Adaptive Rounding Enable",
         MediaUserSetting::Group::Sequence);
-    m_adaptiveRounding = outValue.Get<bool>();
+    bool adaptiveRounding = outValue.Get<bool>();
+    if (adaptiveRounding)
+        m_roundingMethod = RoundingMethod::adaptiveRounding;
 #endif
     return MOS_STATUS_SUCCESS;
 }
@@ -137,7 +139,7 @@
         // The lock operation will bring functional issue under "asyc != 1" condition, as well as pref issue need to be considered.
         // So we choose to by default disable adaptive rounding for CQP, but for BRC, statistics read operation will move to HuC. it's all 
         // fine by nature. so we will open adaptive rounding for BRC all the time as it will bring quality gain.
-        m_adaptiveRounding = true;
+        m_roundingMethod = RoundingMethod::adaptiveRounding;
     }
 
     for (uint32_t i = 0; i < m_NumNalUnits; i++)
@@ -145,7 +147,7 @@
         m_appHdrSize += m_nalUnitParams[i]->uiSize;
         if (IsFrameHeader(*(m_bsBuffer.pBase + m_nalUnitParams[i]->uiOffset)))
         {
-            continue;
+            break;
         }
         m_appHdrSizeExcludeFrameHdr += m_nalUnitParams[i]->uiSize;
     }
@@ -668,7 +670,7 @@
         params.tileBasedReplayMode = true;
     }
 
-    params.frameStatisticsStreamOut = IsRateControlBrc(m_av1SeqParams->RateControlMethod) || m_adaptiveRounding;
+    params.frameStatisticsStreamOut = IsRateControlBrc(m_av1SeqParams->RateControlMethod) || m_roundingMethod == RoundingMethod::adaptiveRounding;
 
     return MOS_STATUS_SUCCESS;
 }
diff --git a/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_basic_feature.h b/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_basic_feature.h
index f5a36e0..c949ca6 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_basic_feature.h
+++ b/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_basic_feature.h
@@ -158,8 +158,10 @@
     bool                               m_enableSWBackAnnotation = true;                        //!< indicate whether SW back annotation enabled or not
     bool                               m_enableSWStitching = false;                             //!< indicate whether SW bitstream stitching enabled or not
     bool                               m_enableNonDefaultMapping = false;                       //!< indicate whether Non-default mapping enabled or not
-    bool                               m_adaptiveRounding   = false;                            //!< whether adaptive rounding will be enabled
+
+    RoundingMethod                     m_roundingMethod = fixedRounding;
     bool                               m_enableCDEF = false;
+    bool                               m_postCdefReconSurfaceFlag = false;
 
     uint32_t                           m_vdencTileSliceStart[av1MaxTileNum] = { 0 };           //!< VDEnc TILE_SLICE buffer offset array for every tile
 
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 afc3ff3..e933184 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
@@ -205,7 +205,7 @@
         dmem->UPD_CurWidth  = (uint16_t)m_basicFeature->m_oriFrameWidth;
         dmem->UPD_CurHeight = (uint16_t)m_basicFeature->m_oriFrameHeight;
         dmem->UPD_Asyn = 0;
-        dmem->UPD_EnableAdaptiveRounding = m_basicFeature->m_adaptiveRounding;
+        dmem->UPD_EnableAdaptiveRounding = (m_basicFeature->m_roundingMethod == RoundingMethod::adaptiveRounding);
 
         if (seqParams->GopRefDist == 8)
             dmem->UPD_MaxBRCLevel = 3;
diff --git a/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_tile.cpp b/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_tile.cpp
index a6d9dec..a54f9a9 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_tile.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_tile.cpp
@@ -892,6 +892,7 @@
         params.tileLCUStreamOutOffset = m_curTileCodingParams.TileLCUStreamOutOffset;
         params.VdencHEVCVP9TileSlicePar18 = true;
         params.VdencHEVCVP9TileSlicePar19 = m_curTileCodingParams.CumulativeCUTileOffset;
+        params.tileRowstoreOffset = 0;
 
         return MOS_STATUS_SUCCESS;
     }
@@ -989,7 +990,7 @@
         ENCODE_CHK_NULL_RETURN(av1Seqparams);
 
         // for BRC, adaptive rounding is done in HuC, so we can skip it here.
-        if (av1BasicFeature->m_adaptiveRounding && !IsRateControlBrc(av1Seqparams->RateControlMethod))
+        if (av1BasicFeature->m_roundingMethod == RoundingMethod::adaptiveRounding && !IsRateControlBrc(av1Seqparams->RateControlMethod))
         {
             uint32_t frameSizeIn8x8Units1 = ((av1BasicFeature->m_oriFrameWidth + 63) >> 6) * ((av1BasicFeature->m_oriFrameHeight + 63) >> 6);
             uint32_t frameSizeIn8x8Units2 = ((av1BasicFeature->m_oriFrameWidth + 7) >> 3) * ((av1BasicFeature->m_oriFrameHeight + 7) >> 3);
@@ -1032,52 +1033,57 @@
                 av1BasicFeature->m_par65Intra = 5;
             }
         }
-        else
+        else if (av1BasicFeature->m_roundingMethod == RoundingMethod::fixedRounding)
         {
             av1BasicFeature->m_par65Inter = 2;
             av1BasicFeature->m_par65Intra = 6;
         }
 
-#if _MEDIA_RESERVED
-        for (auto i = 0; i < 3; i++)
+        if (av1BasicFeature->m_roundingMethod == RoundingMethod::adaptiveRounding
+            || av1BasicFeature->m_roundingMethod == RoundingMethod::fixedRounding)
         {
-            params.vdencCmd2Par65[i][0][0] = av1BasicFeature->m_par65Intra;
-            params.vdencCmd2Par65[i][0][1] = av1BasicFeature->m_par65Intra;
-            params.vdencCmd2Par65[i][1][0] = av1BasicFeature->m_par65Inter;
-            params.vdencCmd2Par65[i][1][1] = av1BasicFeature->m_par65Inter;
-            params.vdencCmd2Par65[i][2][0] = av1BasicFeature->m_par65Inter;
-            params.vdencCmd2Par65[i][2][1] = av1BasicFeature->m_par65Inter;
-        }
+#if _MEDIA_RESERVED
+            for (auto i = 0; i < 3; i++)
+            {
+                params.vdencCmd2Par65[i][0][0] = av1BasicFeature->m_par65Intra;
+                params.vdencCmd2Par65[i][0][1] = av1BasicFeature->m_par65Intra;
+                params.vdencCmd2Par65[i][1][0] = av1BasicFeature->m_par65Inter;
+                params.vdencCmd2Par65[i][1][1] = av1BasicFeature->m_par65Inter;
+                params.vdencCmd2Par65[i][2][0] = av1BasicFeature->m_par65Inter;
+                params.vdencCmd2Par65[i][2][1] = av1BasicFeature->m_par65Inter;
+            }
 #else
-        params.extSettings.emplace_back(
-            [av1BasicFeature](uint32_t *data) {
-                uint8_t tmp0 = av1BasicFeature->m_par65Intra & 0xf;
-                uint8_t tmp1 = av1BasicFeature->m_par65Inter & 0xf;
+            params.extSettings.emplace_back(
+                [av1BasicFeature](uint32_t *data) {
+                    uint8_t tmp0 = av1BasicFeature->m_par65Intra & 0xf;
+                    uint8_t tmp1 = av1BasicFeature->m_par65Inter & 0xf;
 
-                data[32] |= (tmp1 << 16);
-                data[32] |= (tmp1 << 20);
-                data[32] |= (tmp0 << 24);
-                data[32] |= (tmp0 << 28);
+                    data[32] |= (tmp1 << 16);
+                    data[32] |= (tmp1 << 20);
+                    data[32] |= (tmp0 << 24);
+                    data[32] |= (tmp0 << 28);
 
-                data[33] |= tmp1;
-                data[33] |= (tmp1 << 4);
-                data[33] |= (tmp1 << 8);
-                data[33] |= (tmp1 << 12);
-                data[33] |= (tmp0 << 16);
-                data[33] |= (tmp0 << 20);
-                data[33] |= (tmp1 << 24);
-                data[33] |= (tmp1 << 28);
+                    data[33] |= tmp1;
+                    data[33] |= (tmp1 << 4);
+                    data[33] |= (tmp1 << 8);
+                    data[33] |= (tmp1 << 12);
+                    data[33] |= (tmp0 << 16);
+                    data[33] |= (tmp0 << 20);
+                    data[33] |= (tmp1 << 24);
+                    data[33] |= (tmp1 << 28);
 
-                data[34] |= tmp1;
-                data[34] |= (tmp1 << 4);
-                data[34] |= (tmp0 << 8);
-                data[34] |= (tmp0 << 12);
-                data[34] |= (tmp1 << 16);
-                data[34] |= (tmp1 << 20);
+                    data[34] |= tmp1;
+                    data[34] |= (tmp1 << 4);
+                    data[34] |= (tmp0 << 8);
+                    data[34] |= (tmp0 << 12);
+                    data[34] |= (tmp1 << 16);
+                    data[34] |= (tmp1 << 20);
 
-                return MOS_STATUS_SUCCESS;
-            });
-#endif  // _MEDIA_RESERVED
+                    return MOS_STATUS_SUCCESS;
+                });
+#endif  // _MEDIA_RESERVED  
+        }
+
 
         return MOS_STATUS_SUCCESS;
     }
diff --git a/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_vdenc_feature_manager.cpp b/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_vdenc_feature_manager.cpp
index e7a22ea..7088256 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_vdenc_feature_manager.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/av1/features/encode_av1_vdenc_feature_manager.cpp
@@ -56,6 +56,7 @@
 
     if (encodeParams->bNewSeq)
     {
+        m_ddiTargetUsage = av1SeqParams->TargetUsage;
         ENCODE_CHK_STATUS_RETURN(MapTargetUsage(av1SeqParams->TargetUsage));
         m_targetUsage = av1SeqParams->TargetUsage;
     }
diff --git a/media_softlet/agnostic/common/codec/hal/enc/av1/packet/encode_av1_brc_update_packet.cpp b/media_softlet/agnostic/common/codec/hal/enc/av1/packet/encode_av1_brc_update_packet.cpp
index b9ad982..bdcf4ab 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/av1/packet/encode_av1_brc_update_packet.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/av1/packet/encode_av1_brc_update_packet.cpp
@@ -330,6 +330,7 @@
         bool firstTileInGroup = false;
         uint32_t tileGroupIdx = 0;
         RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, Av1FeatureIDs::encodeTile, GetTileRowColumns, numTileRows, numTileColumns);
+        slbData.tileNum = numTileRows * numTileColumns;
 
         for (uint32_t tileRow = 0; tileRow < numTileRows; tileRow++)
         {
@@ -376,7 +377,6 @@
         uint16_t numTileColumns = 1;
         uint16_t numTileRows = 1;
         RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, Av1FeatureIDs::encodeTile, GetTileRowColumns, numTileRows, numTileColumns);
-        slbData.tileNum = numTileRows * numTileColumns;
 
         auto& par = m_vdencItf->MHW_GETPAR_F(VDENC_HEVC_VP9_TILE_SLICE_STATE)();
         par = {};
diff --git a/media_softlet/agnostic/common/codec/hal/enc/av1/packet/encode_av1_vdenc_packet.cpp b/media_softlet/agnostic/common/codec/hal/enc/av1/packet/encode_av1_vdenc_packet.cpp
index dff9741..fc2029c 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/av1/packet/encode_av1_vdenc_packet.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/av1/packet/encode_av1_vdenc_packet.cpp
@@ -29,6 +29,7 @@
 #include "codec_def_common_av1.h"
 #include "media_perf_profiler.h"
 #include "hal_oca_interface_next.h"
+#include "mos_solo_generic.h"
 
 namespace encode{
     Av1VdencPkt::Av1VdencPkt(MediaPipeline* pipeline, MediaTask* task, CodechalHwInterfaceNext* hwInterface) :
@@ -233,6 +234,92 @@
         return MOS_STATUS_SUCCESS;
     }
 
+    MOS_STATUS Av1VdencPkt::Construct3rdLevelBatch()
+    {
+        MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
+
+        //To be added. When BRC is enabled, some of the commands
+        //will be added into 3rd level batch
+
+        return eStatus;
+    }
+
+    MOS_STATUS Av1VdencPkt::UpdateUserFeatureKey(PMOS_SURFACE surface)
+    {
+        if (m_userFeatureUpdated_post_cdef)
+        {
+            return MOS_STATUS_SUCCESS;
+        }
+        m_userFeatureUpdated_post_cdef = true;
+
+        ReportUserSetting(m_userSettingPtr,
+            "AV1 Post CDEF Recon Compressible",
+            surface->bCompressible,
+            MediaUserSetting::Group::Sequence);
+        ReportUserSetting(m_userSettingPtr,
+            "AV1 Post CDEF Recon Compress Mode",
+            surface->MmcState,
+            MediaUserSetting::Group::Sequence);
+
+        return MOS_STATUS_SUCCESS;
+    }
+
+    MOS_STATUS Av1VdencPkt::PatchPictureLevelCommands(const uint8_t &packetPhase, MOS_COMMAND_BUFFER  &cmdBuffer)
+    {
+        ENCODE_FUNC_CALL();
+
+        ENCODE_CHK_STATUS_RETURN(m_miItf->SetWatchdogTimerThreshold(m_basicFeature->m_frameWidth, m_basicFeature->m_frameHeight, true));
+
+        SetPerfTag();
+
+        bool firstTaskInPhase = packetPhase & firstPacket;
+        if (!m_pipeline->IsSingleTaskPhaseSupported() || firstTaskInPhase)
+        {
+            ENCODE_CHK_STATUS_RETURN(AddForceWakeup(cmdBuffer));
+
+            // Send command buffer header at the beginning (OS dependent)
+            ENCODE_CHK_STATUS_RETURN(SendPrologCmds(cmdBuffer));
+        }
+
+        if (m_pipeline->IsDualEncEnabled())
+        {
+            auto scalability = m_pipeline->GetMediaScalability();
+            ENCODE_CHK_NULL_RETURN(scalability);
+            ENCODE_CHK_STATUS_RETURN(scalability->SyncPipe(syncOtherPipesForOne, 0, &cmdBuffer));
+        }
+
+        ENCODE_CHK_STATUS_RETURN(AddCondBBEndFor2ndPass(cmdBuffer));
+
+        if(m_pipeline->IsDualEncEnabled() && m_pipeline->IsFirstPipe())
+        {
+            PMOS_RESOURCE bsSizeBuf = m_basicFeature->m_recycleBuf->GetBuffer(PakInfo, 0);
+            ENCODE_CHK_NULL_RETURN(bsSizeBuf);
+            // clear bitstream size buffer at first tile
+            auto &miStoreDataParams            = m_miItf->MHW_GETPAR_F(MI_STORE_DATA_IMM)();
+            miStoreDataParams                  = {};
+            miStoreDataParams.pOsResource      = bsSizeBuf;
+            miStoreDataParams.dwResourceOffset = 0;
+            miStoreDataParams.dwValue          = 0;
+            ENCODE_CHK_STATUS_RETURN(m_miItf->MHW_ADDCMD_F(MI_STORE_DATA_IMM)(&cmdBuffer));
+        }
+
+        if (m_pipeline->IsFirstPipe())
+        {
+            ENCODE_CHK_STATUS_RETURN(StartStatusReport(statusReportMfx, &cmdBuffer));
+        }
+        else{
+            // add perf record for other pipes - first pipe perf record within StartStatusReport
+            MediaPerfProfiler *perfProfiler = MediaPerfProfiler::Instance();
+            ENCODE_CHK_NULL_RETURN(perfProfiler);
+            ENCODE_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectStartCmd(
+                (void *)m_pipeline, m_osInterface, m_miItf, &cmdBuffer));
+        }
+
+        ENCODE_CHK_STATUS_RETURN(AddPictureVdencCommands(cmdBuffer));
+
+        return MOS_STATUS_SUCCESS;
+    }
+
     void Av1VdencPkt::SetPerfTag()
     {
         ENCODE_FUNC_CALL();
@@ -251,6 +338,137 @@
         m_osInterface->pfnIncPerfBufferID(m_osInterface);
     }
 
+    MOS_STATUS Av1VdencPkt::PatchTileLevelCommands(MOS_COMMAND_BUFFER &cmdBuffer, uint8_t packetPhase)
+    {
+        ENCODE_FUNC_CALL();
+
+        uint16_t numTileColumns = 1;
+        uint16_t numTileRows    = 1;
+        RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, Av1FeatureIDs::encodeTile, GetTileRowColumns, numTileRows, numTileColumns);
+
+        ENCODE_CHK_NULL_RETURN(m_pipeline);
+        if (!m_pipeline->IsDualEncEnabled())
+        {
+            for (uint32_t tileRow = 0; tileRow < numTileRows; tileRow++)
+            {
+                for (uint32_t tileCol = 0; tileCol < numTileColumns; tileCol++)
+                {
+                    ENCODE_CHK_STATUS_RETURN(AddOneTileCommands(
+                        cmdBuffer,
+                        tileRow,
+                        tileCol));
+                }
+            }
+        }
+        else
+        {
+            if (numTileRows != 1)  // dual encode only support column based workload submission
+            {
+                ENCODE_ASSERTMESSAGE("dual encode cannot support multi rows submission yet.");
+                return MOS_STATUS_INVALID_PARAMETER;
+            }
+            uint8_t dummyIdx = 0;
+            RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, Av1FeatureIDs::encodeTile, GetDummyIdx, dummyIdx);
+            if (m_pipeline->GetCurrentPipe() == 0)
+            {
+                for (auto i = 0; i < dummyIdx; i++)
+                {
+                    ENCODE_CHK_STATUS_RETURN(AddOneTileCommands(
+                        cmdBuffer,
+                        0,
+                        i));
+                }
+                ENCODE_CHK_STATUS_RETURN(AddOneTileCommands(
+                    cmdBuffer,
+                    0,
+                    dummyIdx,
+                    1));
+            }
+            else
+            {
+                for (auto i = dummyIdx; i < numTileColumns; i++)
+                {
+                    ENCODE_CHK_STATUS_RETURN(AddOneTileCommands(
+                        cmdBuffer,
+                        0,
+                        i));
+                }
+            }
+        }
+
+        m_basicFeature->m_flushCmd = Av1BasicFeature::waitAvp;
+        SETPAR_AND_ADDCMD(VD_PIPELINE_FLUSH, m_vdencItf, &cmdBuffer);
+
+        ENCODE_CHK_STATUS_RETURN(EnsureAllCommandsExecuted(cmdBuffer));
+
+        // Wait all pipe cmds done for the packet
+        auto scalability = m_pipeline->GetMediaScalability();
+        ENCODE_CHK_NULL_RETURN(scalability);
+        ENCODE_CHK_STATUS_RETURN(scalability->SyncPipe(syncOnePipeWaitOthers, 0, &cmdBuffer));
+
+        if (m_pipeline->IsFirstPipe())
+        {
+            if (m_pipeline->IsDualEncEnabled())
+            {
+                for (auto i = 0; i < m_pipeline->GetPipeNum(); ++i)
+                {
+                    ENCODE_CHK_STATUS_RETURN(scalability->ResetSemaphore(syncOnePipeWaitOthers, i, &cmdBuffer));
+                }
+            }
+            ENCODE_CHK_STATUS_RETURN(EndStatusReport(statusReportMfx, &cmdBuffer));
+        }
+        else {
+            // add perf record for other pipes - first pipe perf record within EndStatusReport
+            MediaPerfProfiler* perfProfiler = MediaPerfProfiler::Instance();
+            ENCODE_CHK_NULL_RETURN(perfProfiler);
+            ENCODE_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectEndCmd(
+                (void*)m_pipeline, m_osInterface, m_miItf, &cmdBuffer));
+        }
+
+        auto brcFeature = dynamic_cast<Av1Brc *>(m_featureManager->GetFeature(Av1FeatureIDs::av1BrcFeature));
+        ENCODE_CHK_NULL_RETURN(brcFeature);
+
+        if (Mos_Solo_Extension((MOS_CONTEXT_HANDLE)m_osInterface->pOsContext))
+        {
+            ENCODE_CHK_STATUS_RETURN(MediaPacket::UpdateStatusReportNext(statusReportGlobalCount, &cmdBuffer));
+        }
+        else if (brcFeature->IsBRCEnabled() && m_osInterface->bInlineCodecStatusUpdate)
+        {
+            ENCODE_CHK_STATUS_RETURN(UpdateStatusReport(statusReportGlobalCount, &cmdBuffer));
+        }
+        else if (m_pipeline->IsLastPass() && m_pipeline->IsFirstPipe())
+        {
+            ENCODE_CHK_STATUS_RETURN(MediaPacket::UpdateStatusReportNext(statusReportGlobalCount, &cmdBuffer));
+        }
+
+        if (m_pipeline->IsDualEncEnabled())
+        {
+            SETPAR_AND_ADDCMD(VDENC_CONTROL_STATE, m_vdencItf, &cmdBuffer);
+        }
+
+        CODECHAL_DEBUG_TOOL(
+            if (m_mmcState) {
+                m_mmcState->UpdateUserFeatureKey(&(m_basicFeature->m_reconSurface));
+            })
+
+        if (m_basicFeature->m_postCdefReconSurfaceFlag)
+        {
+            PCODEC_REF_LIST currRefList  = m_basicFeature->m_ref.GetCurrRefList();
+            ENCODE_CHK_NULL_RETURN(currRefList);
+            MOS_SURFACE *postCdefSurface = m_basicFeature->m_trackedBuf->GetSurface(
+                BufferType::postCdefReconSurface, currRefList->ucScalingIdx);
+            ENCODE_CHK_NULL_RETURN(postCdefSurface);
+            CODECHAL_DEBUG_TOOL(
+                if (m_mmcState) { 
+                    UpdateUserFeatureKey(postCdefSurface); 
+            })
+        }
+
+        UpdateParameters();
+
+        return MOS_STATUS_SUCCESS;
+    }
+
     MOS_STATUS Av1VdencPkt::AddForceWakeup(MOS_COMMAND_BUFFER &cmdBuffer)
     {
         ENCODE_FUNC_CALL();
@@ -298,6 +516,11 @@
         {
             m_basicFeature->m_encodedFrameNum++;
         }
+
+        if (!m_pipeline->IsSingleTaskPhaseSupported())
+        {
+            m_osInterface->pfnResetPerfBufferID(m_osInterface);
+        }
     }
 
     MOS_STATUS Av1VdencPkt::SetPipeBufAddr(
@@ -1034,6 +1257,29 @@
         return MOS_STATUS_SUCCESS;
     }
 
+    MHW_SETPAR_DECL_SRC(AVP_IND_OBJ_BASE_ADDR_STATE, Av1VdencPkt)
+    {
+        params.mvObjectOffset = m_mvOffset;
+        params.mvObjectSize   = m_basicFeature->m_mbCodeSize - m_mvOffset;
+
+        return MOS_STATUS_SUCCESS;
+    }
+
+    MHW_SETPAR_DECL_SRC(AVP_PIC_STATE, Av1VdencPkt)
+    {
+        params.notFirstPass = !m_pipeline->IsFirstPass();
+
+        return MOS_STATUS_SUCCESS;
+    }
+
+    MHW_SETPAR_DECL_SRC(AVP_TILE_CODING, Av1VdencPkt)
+    {
+        uint32_t tileIdx = 0;
+        RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, Av1FeatureIDs::encodeTile, GetTileIdx, tileIdx);
+        params.disableFrameContextUpdateFlag = m_av1PicParams->PicFlags.fields.disable_frame_end_update_cdf || (tileIdx != m_av1PicParams->context_update_tile_id);
+
+        return MOS_STATUS_SUCCESS;
+    }
 
     MOS_STATUS Av1VdencPkt::AddAllCmds_AVP_SURFACE_STATE(PMOS_COMMAND_BUFFER cmdBuffer) const
     {
@@ -1159,6 +1405,71 @@
 
         return MOS_STATUS_SUCCESS;
     }
+
+    MOS_STATUS Av1VdencPkt::AddAllCmds_AVP_PIPE_MODE_SELECT(PMOS_COMMAND_BUFFER cmdBuffer) const
+    {
+        ENCODE_FUNC_CALL();
+
+        ENCODE_CHK_NULL_RETURN(cmdBuffer);
+
+        auto &vdControlStateParams          = m_miItf->MHW_GETPAR_F(VD_CONTROL_STATE)();
+        vdControlStateParams                = {};
+        vdControlStateParams.initialization = true;
+        vdControlStateParams.avpEnabled     = true;
+        ENCODE_CHK_STATUS_RETURN(m_miItf->MHW_ADDCMD_F(VD_CONTROL_STATE)(cmdBuffer));
+
+        // for Gen11+, we need to add MFX wait for both KIN and VRT before and after AVP Pipemode select...
+        SETPAR_AND_ADDCMD(MFX_WAIT, m_miItf, cmdBuffer);
+
+        SETPAR_AND_ADDCMD(AVP_PIPE_MODE_SELECT, m_avpItf, cmdBuffer);
+
+        // for Gen11+, we need to add MFX wait for both KIN and VRT before and after AVP Pipemode select...
+        SETPAR_AND_ADDCMD(MFX_WAIT, m_miItf, cmdBuffer);
+
+        if (m_pipeline->IsDualEncEnabled())
+        {
+            vdControlStateParams = {};
+            vdControlStateParams.avpEnabled           = true;
+            vdControlStateParams.scalableModePipeLock = true;
+
+            ENCODE_CHK_STATUS_RETURN(m_miItf->MHW_ADDCMD_F(VD_CONTROL_STATE)(cmdBuffer));
+        }
+
+        return MOS_STATUS_SUCCESS;
+    }
+
+    MOS_STATUS Av1VdencPkt::AddAllCmds_AVP_SEGMENT_STATE(PMOS_COMMAND_BUFFER cmdBuffer) const
+    {
+        ENCODE_FUNC_CALL();
+
+        ENCODE_CHK_NULL_RETURN(cmdBuffer);
+        ENCODE_CHK_NULL_RETURN(m_featureManager);
+
+        auto &par           = m_avpItf->MHW_GETPAR_F(AVP_SEGMENT_STATE)();
+        par                 = {};
+        auto segmentFeature = dynamic_cast<Av1Segmentation *>(m_featureManager->GetFeature(Av1FeatureIDs::av1Segmentation));
+        ENCODE_CHK_NULL_RETURN(segmentFeature);
+
+        MHW_CHK_STATUS_RETURN(segmentFeature->MHW_SETPAR_F(AVP_SEGMENT_STATE)(par));
+
+        const bool segmentEnabled = par.av1SegmentParams.m_enabled;
+
+        for (uint8_t i = 0; i < av1MaxSegments; i++)
+        {
+            par.currentSegmentId = i;
+            m_avpItf->MHW_ADDCMD_F(AVP_SEGMENT_STATE)(cmdBuffer);
+
+            // If segmentation is not enabled, then AV1_SEGMENT_STATE must still be sent once for SegmentID = 0
+            // If i == numSegments -1, means all segments are issued, break the loop
+            if (!segmentEnabled || (i == par.numSegments - 1))
+            {
+                break;
+            }
+        }
+
+        return MOS_STATUS_SUCCESS;
+    }
+
     MOS_STATUS Av1VdencPkt::GetVdencStateCommandsDataSize(uint32_t *commandsSize, uint32_t *patchListSize) const
     {
         uint32_t            maxSize          = 0;
@@ -2087,7 +2398,45 @@
 
         return MOS_STATUS_SUCCESS;
     }
+    MOS_STATUS Av1VdencPkt::DumpStatistics()
+    {
+        CodechalDebugInterface *debugInterface =  m_pipeline->GetStatusReportDebugInterface();
+        ENCODE_CHK_NULL_RETURN(debugInterface);
 
+        ENCODE_CHK_STATUS_RETURN(debugInterface->DumpBuffer(
+            m_basicFeature->m_tileStatisticsPakStreamoutBuffer,
+            CodechalDbgAttr::attrTileBasedStats,
+            "Pak_Tile_Stats",
+            512,
+            0,
+            CODECHAL_NUM_MEDIA_STATES));
+
+        MOS_RESOURCE* tileStatisticsBuffer = nullptr;
+        RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, FeatureIDs::encodeTile, GetTileBasedStatisticsBuffer, 0, tileStatisticsBuffer);
+        ENCODE_CHK_NULL_RETURN(tileStatisticsBuffer);
+        uint32_t offset = 0;
+        RUN_FEATURE_INTERFACE_RETURN(Av1EncodeTile, Av1FeatureIDs::encodeTile, GetTileStatsOffset, offset);
+
+        ENCODE_CHK_STATUS_RETURN(debugInterface->DumpBuffer(
+            tileStatisticsBuffer,
+            CodechalDbgAttr::attrFrameState,
+            "VDEnc_Frame_Stats",
+            m_hwInterface->m_pakIntTileStatsSize,
+            offset,
+            CODECHAL_NUM_MEDIA_STATES));
+
+        MOS_RESOURCE *pakinfo = m_basicFeature->m_recycleBuf->GetBuffer(PakInfo, 0);
+        ENCODE_CHK_NULL_RETURN(pakinfo);
+        ENCODE_CHK_STATUS_RETURN(debugInterface->DumpBuffer(
+            pakinfo,
+            CodechalDbgAttr::attrFrameState,
+            "VDEnc_PAK_INFO",
+            MOS_ALIGN_CEIL(sizeof(Av1VdencPakInfo), CODECHAL_PAGE_SIZE),
+            0,
+            CODECHAL_NUM_MEDIA_STATES));
+
+        return MOS_STATUS_SUCCESS;
+    }
 #endif
 
 }  // namespace encode
diff --git a/media_softlet/agnostic/common/codec/hal/enc/av1/packet/encode_av1_vdenc_packet.h b/media_softlet/agnostic/common/codec/hal/enc/av1/packet/encode_av1_vdenc_packet.h
index d13662e..9391d42 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/av1/packet/encode_av1_vdenc_packet.h
+++ b/media_softlet/agnostic/common/codec/hal/enc/av1/packet/encode_av1_vdenc_packet.h
@@ -173,6 +173,8 @@
     //!         MOS_STATUS_SUCCESS if success, else fail reason
     //!
     virtual MOS_STATUS DumpInput();
+
+    virtual MOS_STATUS DumpStatistics();
 #endif
 
     virtual MOS_STATUS AllocateResources();
@@ -189,9 +191,23 @@
         MHW_VDBOX_NODE_IND vdboxIndex,
         MediaStatusReport  *statusReport,
         MOS_COMMAND_BUFFER &cmdBuffer);
+    
+    virtual MOS_STATUS AddOneTileCommands(
+        MOS_COMMAND_BUFFER  &cmdBuffer,
+        uint32_t            tileRow,
+        uint32_t            tileCol,
+        uint32_t            tileRowPass = 0) = 0;
+
+    virtual MOS_STATUS EnsureAllCommandsExecuted(MOS_COMMAND_BUFFER &cmdBuffer) = 0;
+
+    virtual MOS_STATUS PatchTileLevelCommands(MOS_COMMAND_BUFFER &cmdBuffer, uint8_t packetPhase);
 
     MOS_STATUS AddCondBBEndFor2ndPass(MOS_COMMAND_BUFFER &cmdBuffer);
 
+    virtual MOS_STATUS Construct3rdLevelBatch();
+
+    virtual MOS_STATUS UpdateUserFeatureKey(PMOS_SURFACE surface);
+
     virtual MOS_STATUS UpdateStatusReport(uint32_t srType, MOS_COMMAND_BUFFER *cmdBuffer) override;
 
     //!
@@ -234,6 +250,7 @@
     //!
     virtual MOS_STATUS CalculateAvpCommandsSize();
     virtual MOS_STATUS AddPictureVdencCommands(MOS_COMMAND_BUFFER &cmdBuffer);
+    virtual MOS_STATUS PatchPictureLevelCommands(const uint8_t &packetPhase, MOS_COMMAND_BUFFER &cmdBuffer);
 
 #if USE_CODECHAL_DEBUG_TOOL
     //! \brief    Dump the output resources in status report callback function
@@ -275,6 +292,7 @@
 
     AtomicScratchBufferAv1 m_atomicScratchBuf = {};  //!< Stores atomic operands and result
 
+    bool m_userFeatureUpdated_post_cdef                 = false;    //!< Inidate if mmc user feature key for post cdef is updated
     bool m_vdencPakObjCmdStreamOutEnabled               = false;    //!< Pakobj stream out enable flag
     PMOS_RESOURCE m_resCumulativeCuCountStreamoutBuffer = nullptr;  //!< Cumulative CU count stream out buffer
     PMOS_RESOURCE m_vdencIntraRowStoreScratch           = nullptr;
@@ -322,10 +340,20 @@
 
     MHW_SETPAR_DECL_HDR(AVP_PIPE_BUF_ADDR_STATE);
 
+    MHW_SETPAR_DECL_HDR(AVP_IND_OBJ_BASE_ADDR_STATE);
+
+    MHW_SETPAR_DECL_HDR(AVP_PIC_STATE);
+
+    MHW_SETPAR_DECL_HDR(AVP_TILE_CODING);
+
     virtual MOS_STATUS AddAllCmds_AVP_SURFACE_STATE(PMOS_COMMAND_BUFFER cmdBuffer) const;
 
     virtual MOS_STATUS AddAllCmds_AVP_PAK_INSERT_OBJECT(PMOS_COMMAND_BUFFER cmdBuffer) const;
 
+    virtual MOS_STATUS AddAllCmds_AVP_PIPE_MODE_SELECT(PMOS_COMMAND_BUFFER cmdBuffer) const;
+
+    virtual MOS_STATUS AddAllCmds_AVP_SEGMENT_STATE(PMOS_COMMAND_BUFFER cmdBuffer) const;
+
     virtual MOS_STATUS GetVdencStateCommandsDataSize(uint32_t *commandsSize, uint32_t *patchListSize) const;
 
     virtual MOS_STATUS GetVdencPrimitiveCommandsDataSize(uint32_t *commandsSize, uint32_t *patchListSize) const;
diff --git a/media_softlet/agnostic/common/codec/hal/enc/avc/features/encode_avc_basic_feature.cpp b/media_softlet/agnostic/common/codec/hal/enc/avc/features/encode_avc_basic_feature.cpp
index 3169267..0d19fdb 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/avc/features/encode_avc_basic_feature.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/avc/features/encode_avc_basic_feature.cpp
@@ -212,6 +212,28 @@
         m_perMBStreamOutEnable = true;
     }
 
+#if MHW_HWCMDPARSER_ENABLED
+    char frameType = '\0';
+    switch (m_picParam->CodingType)
+    {
+    case I_TYPE:
+        frameType = 'I';
+        break;
+    case P_TYPE:
+        frameType = 'P';
+        break;
+    case B_TYPE:
+        frameType = (m_picParam->RefPicFlag) ? 'B' : 'b';
+        break;
+    }
+
+    auto instance = mhw::HwcmdParser::GetInstance();
+    if (instance)
+    {
+        instance->Update(frameType, (void *)m_featureManager);
+    }
+#endif
+
     return MOS_STATUS_SUCCESS;
 }
 
diff --git a/media_softlet/agnostic/common/codec/hal/enc/avc/features/encode_avc_brc.cpp b/media_softlet/agnostic/common/codec/hal/enc/avc/features/encode_avc_brc.cpp
index 1014fa5..1c4e490 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/avc/features/encode_avc_brc.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/avc/features/encode_avc_brc.cpp
@@ -225,7 +225,7 @@
     allocParamsForBufferLinear.dwBytes = sizeof(VdencBrcPakMmio);
     allocParamsForBufferLinear.pBufName = "VDENC BRC PAK MMIO Buffer";
     allocParamsForBufferLinear.ResUsageType = MOS_HW_RESOURCE_USAGE_ENCODE_INTERNAL_READ_WRITE_CACHE;
-    m_basicFeature->m_recycleBuf->RegisterResource(VdencBrcPakMmioBuffer, allocParamsForBufferLinear, 1);
+    ENCODE_CHK_STATUS_RETURN(m_basicFeature->m_recycleBuf->RegisterResource(VdencBrcPakMmioBuffer, allocParamsForBufferLinear, 1));
 
     // Debug buffer
     allocParamsForBufferLinear.dwBytes  = MOS_ALIGN_CEIL(brcSettings.vdencBrcDbgBufferSize, CODECHAL_PAGE_SIZE);
diff --git a/media_softlet/agnostic/common/codec/hal/enc/avc/features/encode_avc_vdenc_feature_manager.cpp b/media_softlet/agnostic/common/codec/hal/enc/avc/features/encode_avc_vdenc_feature_manager.cpp
index d6b22c3..d261794 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/avc/features/encode_avc_vdenc_feature_manager.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/avc/features/encode_avc_vdenc_feature_manager.cpp
@@ -54,6 +54,7 @@
 
     if (encodeParams->bNewSeq)
     {
+        m_ddiTargetUsage = avcSeqParams->TargetUsage;
         ENCODE_CHK_STATUS_RETURN(MapTargetUsage(avcSeqParams->TargetUsage));
         m_targetUsage = avcSeqParams->TargetUsage;
     }
diff --git a/media_softlet/agnostic/common/codec/hal/enc/avc/features/encode_avc_vdenc_stream_in_feature.cpp b/media_softlet/agnostic/common/codec/hal/enc/avc/features/encode_avc_vdenc_stream_in_feature.cpp
index afee243..a1aa368 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/avc/features/encode_avc_vdenc_stream_in_feature.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/avc/features/encode_avc_vdenc_stream_in_feature.cpp
@@ -84,12 +84,14 @@
         allocParams.Type = MOS_GFXRES_BUFFER;
         allocParams.TileType = MOS_TILE_LINEAR;
         allocParams.Format = Format_Buffer;
-        allocParams.ResUsageType = MOS_HW_RESOURCE_USAGE_ENCODE_INTERNAL_WRITE;
+        allocParams.ResUsageType = MOS_HW_RESOURCE_USAGE_ENCODE_INTERNAL_READ_WRITE_CACHE;
+        allocParams.bIsPersistent = true;
+        allocParams.dwMemType = MOS_MEMPOOL_VIDEOMEMORY;
 
         m_widthInMb = m_basicFeature->m_picWidthInMb;
         m_heightInMb = m_basicFeature->m_picHeightInMb;
 
-        allocParams.dwBytes = m_widthInMb * m_heightInMb * AvcVdencStreamInState::byteSize;
+        allocParams.dwBytes = MOS_ALIGN_CEIL(m_widthInMb * m_heightInMb * AvcVdencStreamInState::byteSize, CODECHAL_CACHELINE_SIZE);
         allocParams.pBufName = "AVC VDEnc StreamIn Data Buffer";
 
         ENCODE_CHK_STATUS_RETURN(m_basicFeature->m_recycleBuf->RegisterResource(RecycleResId::StreamInBuffer, allocParams));
diff --git a/media_softlet/agnostic/common/codec/hal/enc/avc/features/roi/encode_avc_vdenc_brc_roi_feature.cpp b/media_softlet/agnostic/common/codec/hal/enc/avc/features/roi/encode_avc_vdenc_brc_roi_feature.cpp
index dec3b6a..42f0b69 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/avc/features/roi/encode_avc_vdenc_brc_roi_feature.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/avc/features/roi/encode_avc_vdenc_brc_roi_feature.cpp
@@ -56,9 +56,11 @@
             allocParams.Type = MOS_GFXRES_BUFFER;
             allocParams.TileType = MOS_TILE_LINEAR;
             allocParams.Format = Format_Buffer;
-            allocParams.dwBytes = m_basicFeature->m_picWidthInMb * m_basicFeature->m_picHeightInMb;
+            allocParams.dwBytes = MOS_ALIGN_CEIL(m_basicFeature->m_picWidthInMb * m_basicFeature->m_picHeightInMb, CODECHAL_CACHELINE_SIZE);
             allocParams.pBufName = "VDENC BRC ROI Map Buffer";
-            allocParams.ResUsageType = MOS_HW_RESOURCE_USAGE_ENCODE_INTERNAL_WRITE;
+            allocParams.ResUsageType = MOS_HW_RESOURCE_USAGE_ENCODE_INTERNAL_READ_WRITE_CACHE;
+            allocParams.bIsPersistent = true;
+            allocParams.dwMemType = MOS_MEMPOOL_VIDEOMEMORY;
             ENCODE_CHK_STATUS_RETURN(m_basicFeature->m_recycleBuf->RegisterResource(RecycleResId::HucRoiMapBuffer, allocParams));
         }
 
diff --git a/media_softlet/agnostic/common/codec/hal/enc/avc/features/roi/encode_avc_vdenc_roi_interface.cpp b/media_softlet/agnostic/common/codec/hal/enc/avc/features/roi/encode_avc_vdenc_roi_interface.cpp
index 1e1fe16..c8955c1 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/avc/features/roi/encode_avc_vdenc_roi_interface.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/avc/features/roi/encode_avc_vdenc_roi_interface.cpp
@@ -171,11 +171,16 @@
     m_picParam->NumROIDistinctDeltaQp = (int8_t)numQp;
     
     int32_t lastROIIdx = MOS_CLAMP_MIN_MAX(numQp - 1, 0, m_maxNumRoi - 1);
+
+#if _MEDIA_RESERVED
+    return (!(numQp > m_maxNumNativeRoi || m_picParam->ROIDistinctDeltaQp[0] < -8 || m_picParam->ROIDistinctDeltaQp[lastROIIdx] > 7));
+#else
     bool bIsNativeROI = (!(numQp > m_maxNumNativeRoi || m_picParam->ROIDistinctDeltaQp[0] < -8 || m_picParam->ROIDistinctDeltaQp[lastROIIdx] > 7));
     bool bIsNativeROIAllowed = !m_brcFeature->IsVdencBrcEnabled() || m_brcFeature->IsMbBrcEnabled(); // BRC native ROI require MBBRC on
 
     // return whether is native ROI or not
     return bIsNativeROI && bIsNativeROIAllowed;
+#endif  // _MEDIA_RESERVED
 }
 
 MOS_STATUS AvcVdencRoiInterface::SetupROI()
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 205eac4..3540d5f 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
@@ -305,6 +305,10 @@
         ENCODE_FUNC_CALL();
         ENCODE_CHK_NULL_RETURN(m_basicFeature);
         ENCODE_CHK_NULL_RETURN(m_basicFeature->m_trackedBuf);
+        ENCODE_CHK_NULL_RETURN(m_seqParam);
+
+        // Set flag bIsMdfLoad in remote gaming scenario to boost GPU frequency for low latency
+        cmdBuffer.Attributes.bFrequencyBoost = (m_seqParam->ScenarioInfo == ESCENARIO_REMOTEGAMING);
 
         ENCODE_CHK_STATUS_RETURN(m_miItf->SetWatchdogTimerThreshold(m_basicFeature->m_frameWidth, m_basicFeature->m_frameHeight, true));
 
@@ -373,7 +377,13 @@
             secondLevelBatchBufferUsed = &(m_batchBufferForVdencImgStat[m_pipeline->m_currRecycledBufIdx]);
 
             // CQP case, driver programs the 2nd Level BB
-            ENCODE_CHK_STATUS_RETURN(Mhw_LockBb(m_osInterface, secondLevelBatchBufferUsed));
+            MOS_STATUS status = Mhw_LockBb(m_osInterface, secondLevelBatchBufferUsed);
+            if (status != MOS_STATUS_SUCCESS)
+            {
+                ENCODE_NORMALMESSAGE("ERROR - Recycled buffer index exceed the maximum");
+                SETPAR_AND_ADDCMD(MI_BATCH_BUFFER_END, m_miItf, &cmdBuffer);
+                return status;
+            }
 
             SETPAR_AND_ADDCMD(MFX_AVC_IMG_STATE, m_mfxItf, nullptr, secondLevelBatchBufferUsed);
             SETPAR_AND_ADDCMD(VDENC_CMD3, m_vdencItf, nullptr, secondLevelBatchBufferUsed);
@@ -1427,9 +1437,6 @@
     {
         ENCODE_FUNC_CALL();
 
-        // Set flag bIsMdfLoad in remote gaming scenario to boost GPU frequency for low latency
-        cmdBuffer.Attributes.bFrequencyBoost = (m_seqParam->ScenarioInfo == ESCENARIO_REMOTEGAMING);
-
         auto packetUtilities = m_pipeline->GetPacketUtilities();
         ENCODE_CHK_NULL_RETURN(packetUtilities);
         if (m_basicFeature->m_setMarkerEnabled)
diff --git a/media_softlet/agnostic/common/codec/hal/enc/avc/pipeline/encode_avc_vdenc_pipeline.cpp b/media_softlet/agnostic/common/codec/hal/enc/avc/pipeline/encode_avc_vdenc_pipeline.cpp
index b01c644..2def910 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/avc/pipeline/encode_avc_vdenc_pipeline.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/avc/pipeline/encode_avc_vdenc_pipeline.cpp
@@ -262,28 +262,6 @@
     auto avcBasicfeature = dynamic_cast<AvcBasicFeature *>(m_featureManager->GetFeature(FeatureIDs::basicFeature));
     ENCODE_CHK_NULL_RETURN(avcBasicfeature);
 
-#if MHW_HWCMDPARSER_ENABLED
-    char frameType = '\0';
-    switch (avcBasicfeature->m_picParam->CodingType)
-    {
-    case I_TYPE:
-        frameType = 'I';
-        break;
-    case P_TYPE:
-        frameType = 'P';
-        break;
-    case B_TYPE:
-        frameType = (avcBasicfeature->m_picParam->RefPicFlag) ? 'B' : 'b';
-        break;
-    }
-
-    auto instance = mhw::HwcmdParser::GetInstance();
-    if (instance)
-    {
-        instance->Update(frameType, (void *)m_featureManager);
-    }
-#endif
-
     m_currRecycledBufIdx = (m_currRecycledBufIdx + 1) % CODECHAL_ENCODE_RECYCLED_BUFFER_NUM;
     if (m_currRecycledBufIdx == 0)
     {
diff --git a/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_cqp.cpp b/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_cqp.cpp
index fd7a9f8..2d74595 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_cqp.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_cqp.cpp
@@ -137,7 +137,7 @@
     m_rdoqIntraTuThreshold = 0;
     if (m_rdoqEnable)
     {
-        if (2 == m_basicFeature->m_targetUsage || 4 == m_basicFeature->m_targetUsage)
+        if (1 == m_basicFeature->m_targetUsage || 2 == m_basicFeature->m_targetUsage || 4 == m_basicFeature->m_targetUsage || 6 == m_basicFeature->m_targetUsage)
         {
             m_rdoqIntraTuThreshold = 0xffff;
         }
diff --git a/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_tile.cpp b/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_tile.cpp
index 0198325..3e435fc 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_tile.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_tile.cpp
@@ -939,6 +939,7 @@
             }
 
             params.tileLCUStreamOutOffset = tileLCUStreamOutByteOffset;
+            params.tileRowstoreOffset     = (params.tileStartLCUY == 0) ? (params.tileStartLCUX * params.ctbSize) / 32 : 0;
         }
 
         return MOS_STATUS_SUCCESS;
diff --git a/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_vdenc_feature_manager.cpp b/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_vdenc_feature_manager.cpp
index 720400b..50b1c30 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_vdenc_feature_manager.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_vdenc_feature_manager.cpp
@@ -66,6 +66,7 @@
 
     if (encodeParams->bNewSeq)
     {
+        m_ddiTargetUsage = hevcSeqParams->TargetUsage;
         ENCODE_CHK_STATUS_RETURN(MapTargetUsage(hevcSeqParams->TargetUsage));
         m_targetUsage = hevcSeqParams->TargetUsage;
     }
diff --git a/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_vdenc_scc.cpp b/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_vdenc_scc.cpp
index 85120b9..1a4c500 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_vdenc_scc.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_vdenc_scc.cpp
@@ -174,7 +174,7 @@
             return eStatus;
         }
 
-        if (m_mmcEnabled)
+        if (m_mmcEnabled && IsCompressFlagNeeded())
         {
             allocParamsForBuffer2D.bIsCompressible = true;
             allocParamsForBuffer2D.CompressionMode = MOS_MMC_MC;
diff --git a/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_vdenc_scc.h b/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_vdenc_scc.h
index e732152..f0a23f2 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_vdenc_scc.h
+++ b/media_softlet/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_vdenc_scc.h
@@ -97,6 +97,8 @@
         //!
         bool IsSCCEnabled() { return m_enableSCC; }
 
+        virtual bool IsCompressFlagNeeded() { return true; }
+
         MHW_SETPAR_DECL_HDR(VDENC_PIPE_MODE_SELECT);
 
         MHW_SETPAR_DECL_HDR(VDENC_PIPE_BUF_ADDR_STATE);
diff --git a/media_softlet/agnostic/common/codec/hal/enc/hevc/pipeline/encode_hevc_pipeline.cpp b/media_softlet/agnostic/common/codec/hal/enc/hevc/pipeline/encode_hevc_pipeline.cpp
index b4b798e..0e80935 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/hevc/pipeline/encode_hevc_pipeline.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/hevc/pipeline/encode_hevc_pipeline.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2018-2021, Intel Corporation
+* Copyright (c) 2018-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -221,6 +221,9 @@
     oss << "ScenarioInfo = " << +seqParams->ScenarioInfo << std::endl;
     oss << "Frame Size Tolerance = " << +seqParams->FrameSizeTolerance << std::endl;
     oss << "palette_mode_enabled_flag = " << +seqParams->palette_mode_enabled_flag << std::endl;
+    oss << "RGBInputStudioRange = " << +seqParams->RGBInputStudioRange << std::endl;
+    oss << "ConvertedYUVStudioRange = " << +seqParams->ConvertedYUVStudioRange << std::endl;
+    oss << "InputColorSpace = " << +seqParams->InputColorSpace << std::endl;
     oss << "Look Ahead Depth = " << +seqParams->LookaheadDepth << std::endl;
     oss << "Look Ahead Phase = " << +seqParams->bLookAheadPhase << std::endl;
 
diff --git a/media_softlet/agnostic/common/codec/hal/enc/shared/packet/encode_check_huc_load_packet.cpp b/media_softlet/agnostic/common/codec/hal/enc/shared/packet/encode_check_huc_load_packet.cpp
index 1cd62cb..7209edb 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/shared/packet/encode_check_huc_load_packet.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/shared/packet/encode_check_huc_load_packet.cpp
@@ -25,7 +25,6 @@
 //!
 
 #include "encode_check_huc_load_packet.h"
-#include "mhw_mi_hwcmd_xe_lpm_plus_base_next.h"
 
 namespace encode
 {
@@ -196,7 +195,7 @@
         conditionalBatchBufferEndParams.bDisableCompareMask            = false;
         conditionalBatchBufferEndParams.dwParamsType                   = mhw::mi::MHW_MI_ENHANCED_CONDITIONAL_BATCH_BUFFER_END_PARAMS::ENHANCED_PARAMS;
         conditionalBatchBufferEndParams.enableEndCurrentBatchBuffLevel = true;
-        conditionalBatchBufferEndParams.compareOperation               = mhw::mi::xe_lpm_plus_base_next::Cmd::MI_CONDITIONAL_BATCH_BUFFER_END_CMD::COMPARE_OPERATION_MADEQUALIDD;
+        conditionalBatchBufferEndParams.compareOperation               = COMPARE_OPERATION_MADEQUALIDD;
         ENCODE_CHK_STATUS_RETURN(m_miItf->MHW_ADDCMD_F(MI_CONDITIONAL_BATCH_BUFFER_END)(&cmdBuffer));
 
         // Chained BB loop
diff --git a/media_softlet/agnostic/common/codec/hal/enc/shared/packet/encode_check_huc_load_packet.h b/media_softlet/agnostic/common/codec/hal/enc/shared/packet/encode_check_huc_load_packet.h
index 392d2cd..aca237a 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/shared/packet/encode_check_huc_load_packet.h
+++ b/media_softlet/agnostic/common/codec/hal/enc/shared/packet/encode_check_huc_load_packet.h
@@ -87,6 +87,16 @@
         MHW_BATCH_BUFFER   m_2ndLevelBB[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {};      //!< 2nd level batch buffer
         PMHW_BATCH_BUFFER  m_batchBuf           = nullptr;
 
+        enum COMPARE_OPERATION
+        {
+            COMPARE_OPERATION_MADGREATERTHANIDD        = 0, //!< If Indirect fetched data is greater than inline data then continue.
+            COMPARE_OPERATION_MADGREATERTHANOREQUALIDD = 1, //!< If Indirect fetched data is greater than or equal to inline data then continue.
+            COMPARE_OPERATION_MADLESSTHANIDD           = 2, //!< If Indirect fetched data is less than inline data then continue.
+            COMPARE_OPERATION_MADLESSTHANOREQUALIDD    = 3, //!< If Indirect fetched data is less than or equal to inline data then continue.
+            COMPARE_OPERATION_MADEQUALIDD              = 4, //!< If Indirect fetched data is equal to inline data then continue.
+            COMPARE_OPERATION_MADNOTEQUALIDD           = 5, //!< If Indirect fetched data is not equal to inline data then continue.
+        };
+
 MEDIA_CLASS_DEFINE_END(encode__CheckHucLoadPkt)
     };
 }  // namespace decode
diff --git a/media_softlet/agnostic/common/codec/hal/enc/shared/pipeline/encode_pipeline.cpp b/media_softlet/agnostic/common/codec/hal/enc/shared/pipeline/encode_pipeline.cpp
index b443d71..7d3b164 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/shared/pipeline/encode_pipeline.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/shared/pipeline/encode_pipeline.cpp
@@ -187,6 +187,12 @@
         "Media Encode Used VDBOX Number",
         GetPipeNum(),
         MediaUserSetting::Group::Sequence);
+
+    ReportUserSettingForDebug(
+        m_userSettingPtr,
+        "Media Encode DDI TargetUsage",
+        GetDDITU(),
+        MediaUserSetting::Group::Sequence);
 #endif // _DEBUG || _RELEASE_INTERNAL
 
     return MOS_STATUS_SUCCESS;
diff --git a/media_softlet/agnostic/common/codec/hal/enc/shared/pipeline/encode_pipeline.h b/media_softlet/agnostic/common/codec/hal/enc/shared/pipeline/encode_pipeline.h
index 6678238..808eafd 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/shared/pipeline/encode_pipeline.h
+++ b/media_softlet/agnostic/common/codec/hal/enc/shared/pipeline/encode_pipeline.h
@@ -285,6 +285,16 @@
     }
 
     //!
+    //! \brief    Help function to get ddi target usage
+    //!
+    //! \return   DDI Target Usage
+    //!
+    virtual uint8_t GetDDITU()
+    {
+        return m_featureManager->GetDDITargetUsage();
+    }
+
+    //!
     //! \brief    Help function to get pass number
     //!
     //! \return   Pass number
diff --git a/media_softlet/agnostic/common/codec/hal/enc/shared/pipeline/encode_user_setting.cpp b/media_softlet/agnostic/common/codec/hal/enc/shared/pipeline/encode_user_setting.cpp
index 487b496..7206a13 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/shared/pipeline/encode_user_setting.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/shared/pipeline/encode_user_setting.cpp
@@ -211,6 +211,12 @@
         MediaUserSetting::Group::Sequence,
         int32_t(1),
         true);
+    DeclareUserSettingKeyForDebug(
+        userSettingPtr,
+        "Media Encode DDI TargetUsage",
+        MediaUserSetting::Group::Sequence,
+        int32_t(0),
+        true);
 #endif
 
 #if _MEDIA_RESERVED
diff --git a/media_softlet/agnostic/common/codec/hal/enc/shared/statusreport/encode_status_report.h b/media_softlet/agnostic/common/codec/hal/enc/shared/statusreport/encode_status_report.h
index e4a86f7..3377438 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/shared/statusreport/encode_status_report.h
+++ b/media_softlet/agnostic/common/codec/hal/enc/shared/statusreport/encode_status_report.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2018-2021, Intel Corporation
+* Copyright (c) 2018-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -277,6 +277,8 @@
         uint32_t                        av1EnableFrameOBU;
         uint32_t                        frameWidth;
         uint32_t                        frameHeight;
+
+        uint32_t                        MSE[3];
     };
 
     class EncoderStatusReport : public MediaStatusReport
diff --git a/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_tile.cpp b/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_tile.cpp
index a34cfbe..7fc271c 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_tile.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_tile.cpp
@@ -681,6 +681,7 @@
         params.tileEnable              = 1;
         params.tileStreamInOffset      = tileCodingParams.TileStreaminOffset;
         params.tileLCUStreamOutOffset  = tileCodingParams.TileLCUStreamOutOffset;
+        params.tileRowstoreOffset      = (params.tileStartLCUY == 0) ? (params.tileStartLCUX * params.ctbSize) / 32 : 0;
 
         params.VdencHEVCVP9TileSlicePar18 = 0;
         params.VdencHEVCVP9TileSlicePar19 = tileCodingParams.CumulativeCUTileOffset;
diff --git a/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_vdenc_feature_manager.cpp b/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_vdenc_feature_manager.cpp
index fab9d7e..cf63f96 100644
--- a/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_vdenc_feature_manager.cpp
+++ b/media_softlet/agnostic/common/codec/hal/enc/vp9/features/encode_vp9_vdenc_feature_manager.cpp
@@ -65,6 +65,7 @@
         ENCODE_CHK_NULL_RETURN(basicFeature);
         basicFeature->m_oriTargetUsage = seqParams->TargetUsage;
 
+        m_ddiTargetUsage = seqParams->TargetUsage;
         ENCODE_CHK_STATUS_RETURN(MapTargetUsage(seqParams->TargetUsage));
         m_targetUsage = seqParams->TargetUsage;
     }
diff --git a/media_softlet/agnostic/common/hw/mhw_blt_cmdpar.h b/media_softlet/agnostic/common/hw/mhw_blt_cmdpar.h
index a4ec036..15426ac 100644
--- a/media_softlet/agnostic/common/hw/mhw_blt_cmdpar.h
+++ b/media_softlet/agnostic/common/hw/mhw_blt_cmdpar.h
@@ -64,6 +64,8 @@
     uint32_t      dwDstRight;
     uint32_t      dwSrcOffset;
     uint32_t      dwDstOffset;
+    uint32_t      dwPlaneIndex;
+    uint32_t      dwPlaneNum;
     PMOS_RESOURCE pSrcOsResource;
     PMOS_RESOURCE pDstOsResource;
 };
diff --git a/media_softlet/agnostic/common/hw/mhw_blt_impl.h b/media_softlet/agnostic/common/hw/mhw_blt_impl.h
index 4c59f81..6355518 100644
--- a/media_softlet/agnostic/common/hw/mhw_blt_impl.h
+++ b/media_softlet/agnostic/common/hw/mhw_blt_impl.h
@@ -84,6 +84,8 @@
         par.dwDstRight      = pBlockCopyBltParam->dwDstRight;
         par.dwSrcOffset     = srcOffset;
         par.dwDstOffset     = dstOffset;
+        par.dwPlaneIndex    = pBlockCopyBltParam->dwPlaneIndex;
+        par.dwPlaneNum      = pBlockCopyBltParam->dwPlaneNum;
         par.pSrcOsResource  = pBlockCopyBltParam->pSrcOsResource;
         par.pDstOsResource  = pBlockCopyBltParam->pDstOsResource;
 
@@ -92,108 +94,6 @@
         return MOS_STATUS_SUCCESS;
     }
 
-    //!
-    //! \brief    Add fast copy blt
-    //! \details  BLT function to add block copy command
-    //! \param    [in] pCmdBuffer
-    //!           Pointer to Command buffer
-    //! \param    [in] pFastCopyBltParam
-    //!           Pointer to MHW_FAST_COPY_BLT_PARAM
-    //! \param    [in] srcOffset
-    //!           input surface's soruce offset
-    //! \param    [in] outOffset
-    //!           output surface's soruce offset
-    //! \return   MOS_STATUS
-    //!           MOS_STATUS_SUCCESS if success, else fail reason
-    //!
-    MOS_STATUS AddFastCopyBlt(
-            PMOS_COMMAND_BUFFER      pCmdBuffer,
-            PMHW_FAST_COPY_BLT_PARAM pFastCopyBltParam, 
-            uint32_t                 srcOffset,
-            uint32_t                 dstOffset) override
-    {
-        MHW_CHK_NULL_RETURN(pCmdBuffer);
-        MHW_CHK_NULL_RETURN(pFastCopyBltParam);
-
-        auto& par = MHW_GETPAR_F(XY_FAST_COPY_BLT)();
-        par = {};
-        par.dwColorDepth    = pFastCopyBltParam->dwColorDepth;
-        par.dwSrcPitch      = pFastCopyBltParam->dwSrcPitch;
-        par.dwDstPitch      = pFastCopyBltParam->dwDstPitch;
-        par.dwSrcTop        = pFastCopyBltParam->dwSrcTop;
-        par.dwSrcLeft       = pFastCopyBltParam->dwSrcLeft;
-        par.dwDstTop        = pFastCopyBltParam->dwDstTop;
-        par.dwDstBottom     = pFastCopyBltParam->dwDstBottom;
-        par.dwDstLeft       = pFastCopyBltParam->dwDstLeft;
-        par.dwDstRight      = pFastCopyBltParam->dwDstRight;
-        par.dwSrcOffset     = srcOffset;
-        par.dwDstOffset     = dstOffset;
-        par.pSrcOsResource  = pFastCopyBltParam->pSrcOsResource;
-        par.pDstOsResource  = pFastCopyBltParam->pDstOsResource;
-
-        MHW_CHK_STATUS_RETURN(MHW_ADDCMD_F(XY_FAST_COPY_BLT)(pCmdBuffer));
-
-        return MOS_STATUS_SUCCESS;
-    }
-
-    _MHW_SETCMD_OVERRIDE_DECL(XY_FAST_COPY_BLT)
-    {
-        MHW_FUNCTION_ENTER;
-
-        _MHW_SETCMD_CALLBASE(XY_FAST_COPY_BLT);
-
-        MHW_RESOURCE_PARAMS                    ResourceParams;
-        BLT_TILE_TYPE dstTiledMode = static_cast<BLT_TILE_TYPE>(params.pDstOsResource->pGmmResInfo->GetTileType());
-        BLT_TILE_TYPE srcTiledMode = static_cast<BLT_TILE_TYPE>(params.pSrcOsResource->pGmmResInfo->GetTileType());
-
-        MHW_CHK_NULL_RETURN(this->m_currentCmdBuf);
-        MHW_CHK_NULL_RETURN(this->m_osItf);
-
-        cmd.DW0.SourceTilingMethod            = GetFastTilingMode(srcTiledMode);
-        cmd.DW0.DestinationTilingMethod       = GetFastTilingMode(dstTiledMode);
-        cmd.DW1.TileYTypeForSource            = (srcTiledMode == BLT_NOT_TILED) ? 0 : 1;
-        cmd.DW1.TileYTypeForDestination       = (dstTiledMode == BLT_NOT_TILED) ? 0 : 1;
-        cmd.DW1.ColorDepth                    = params.dwColorDepth;
-        cmd.DW1.DestinationPitch              = params.dwDstPitch;
-        cmd.DW2.DestinationX1CoordinateLeft   = params.dwDstLeft;
-        cmd.DW2.DestinationY1CoordinateTop    = params.dwDstTop;
-        cmd.DW3.DestinationX2CoordinateRight  = params.dwDstRight;
-        cmd.DW3.DestinationY2CoordinateBottom = params.dwDstBottom;
-        cmd.DW6.SourceX1CoordinateLeft        = params.dwSrcLeft;
-        cmd.DW6.SourceY1CoordinateTop         = params.dwSrcTop;
-        cmd.DW7.SourcePitch                   = params.dwSrcPitch;
-
-        // add source address
-        MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams));
-        ResourceParams.dwLsbNum        = 0;
-        ResourceParams.dwOffset        = params.dwSrcOffset;   //srcOffset;
-        ResourceParams.presResource    = params.pSrcOsResource;
-        ResourceParams.pdwCmd          = &(cmd.DW8_9.Value[0]);
-        ResourceParams.dwLocationInCmd = 8;
-        ResourceParams.bIsWritable     = false;
-
-        MHW_CHK_STATUS_RETURN(AddResourceToCmd(
-            this->m_osItf,
-            this->m_currentCmdBuf,
-            &ResourceParams));
-
-        // add destination address
-        MOS_ZeroMemory(&ResourceParams, sizeof(ResourceParams));
-        ResourceParams.dwLsbNum        = 0;
-        ResourceParams.dwOffset        = params.dwDstOffset;  //dstOffset;
-        ResourceParams.presResource    = params.pDstOsResource;
-        ResourceParams.pdwCmd          = &(cmd.DW4_5.Value[0]);
-        ResourceParams.dwLocationInCmd = 4;
-        ResourceParams.bIsWritable     = true;
-
-        MHW_CHK_STATUS_RETURN(AddResourceToCmd(
-            this->m_osItf,
-            this->m_currentCmdBuf,
-            &ResourceParams));
-
-        return MOS_STATUS_SUCCESS;
-    }
-
     _MHW_SETCMD_OVERRIDE_DECL(XY_BLOCK_COPY_BLT)
     {
         MHW_FUNCTION_ENTER;
diff --git a/media_softlet/agnostic/common/hw/mhw_blt_itf.h b/media_softlet/agnostic/common/hw/mhw_blt_itf.h
index 583c54a..a1c4a8f 100644
--- a/media_softlet/agnostic/common/hw/mhw_blt_itf.h
+++ b/media_softlet/agnostic/common/hw/mhw_blt_itf.h
@@ -63,12 +63,6 @@
             uint32_t                 srcOffset,
             uint32_t                 dstOffset) = 0;
     
-    virtual MOS_STATUS AddFastCopyBlt(
-            PMOS_COMMAND_BUFFER      pCmdBuffer,
-            PMHW_FAST_COPY_BLT_PARAM pFastCopyBltParam,
-            uint32_t                 srcOffset,
-            uint32_t                 dstOffset) = 0;
-    
     _BLT_CMD_DEF(_MHW_CMD_ALL_DEF_FOR_ITF);
 MEDIA_CLASS_DEFINE_END(mhw__blt__Itf)
 };
diff --git a/media_softlet/agnostic/common/hw/mhw_impl.h b/media_softlet/agnostic/common/hw/mhw_impl.h
index e412cd4..c3584f6 100644
--- a/media_softlet/agnostic/common/hw/mhw_impl.h
+++ b/media_softlet/agnostic/common/hw/mhw_impl.h
@@ -204,6 +204,40 @@
         return tileMode;
     }
 
+    static uint16_t Fp32_to_Fp16(float value)
+    {
+        //FP32 sign 1 bit, exponent 8 bits, fraction 23 bits
+        //FP16 sign 1 bit, exponent 5 bits, fraction 10 bits
+        uint32_t bits     = *((uint32_t *)&value);
+        uint16_t sign     = (bits >> 31) & 0x1;
+        uint16_t exponent = (bits >> 23) & 0xFF;
+        uint32_t fraction = bits & 0x7FFFFF;
+        int16_t  exp_fp16;
+        if (exponent == 0xFF)
+        {
+            exp_fp16 = 0x1F;
+        }
+        else if (exponent == 0)
+        {
+            exp_fp16 = 0;
+        }
+        else
+        {
+            exp_fp16 = exponent - 127 + 15;
+        }
+        uint16_t fraction_fp16 = (fraction + 0x1000) >> 13;
+        uint16_t result        = (sign << 15) | (exp_fp16 << 10) | fraction_fp16;
+        if (0 == sign)
+        {
+            result = MOS_MIN(result, 0x7bff);  //Infinity:0x7c00
+        }
+        else
+        {
+            result = MOS_MIN(result, 0xfbff);  //-Infinity:0xfc00
+        }
+        return result;
+    }
+
     Impl(PMOS_INTERFACE osItf)
     {
         MHW_FUNCTION_ENTER;
diff --git a/media_softlet/agnostic/common/hw/mhw_mi_cmdpar.h b/media_softlet/agnostic/common/hw/mhw_mi_cmdpar.h
index c1cf402..dbe3f61 100644
--- a/media_softlet/agnostic/common/hw/mhw_mi_cmdpar.h
+++ b/media_softlet/agnostic/common/hw/mhw_mi_cmdpar.h
@@ -122,7 +122,9 @@
         MHW_MMIO_VE1_AUX_TABLE_INVALIDATE  = 21,
         MHW_MMIO_CCS0_AUX_TABLE_BASE_LOW   = 22,
         MHW_MMIO_CCS0_AUX_TABLE_BASE_HIGH  = 23,
-        MHW_MMIO_CCS0_AUX_TABLE_INVALIDATE = 24,
+        MHW_MMIO_BLT_AUX_TABLE_BASE_LOW    = 24,
+        MHW_MMIO_BLT_AUX_TABLE_BASE_HIGH   = 25,
+        MHW_MMIO_CCS0_AUX_TABLE_INVALIDATE = 26,
     };
 
     struct MHW_MI_ALU_PARAMS
diff --git a/media_softlet/agnostic/common/hw/mhw_mi_impl.h b/media_softlet/agnostic/common/hw/mhw_mi_impl.h
index 08b4f29..f6a9b59 100644
--- a/media_softlet/agnostic/common/hw/mhw_mi_impl.h
+++ b/media_softlet/agnostic/common/hw/mhw_mi_impl.h
@@ -307,6 +307,12 @@
         return eStatus;
     }
 
+     virtual MOS_STATUS AddBLTMMIOPrologCmd(
+        PMOS_COMMAND_BUFFER cmdBuffer) override
+    { 
+        return MOS_STATUS_SUCCESS;
+    }
+
 protected:
     using base_t = Itf;
 
diff --git a/media_softlet/agnostic/common/hw/mhw_mi_itf.h b/media_softlet/agnostic/common/hw/mhw_mi_itf.h
index 9e9e916..c8a7ef6 100644
--- a/media_softlet/agnostic/common/hw/mhw_mi_itf.h
+++ b/media_softlet/agnostic/common/hw/mhw_mi_itf.h
@@ -109,6 +109,8 @@
 
     virtual MOS_STATUS AddVeboxMMIOPrologCmd(PMOS_COMMAND_BUFFER CmdBuffer) = 0;
 
+    virtual MOS_STATUS AddBLTMMIOPrologCmd(PMOS_COMMAND_BUFFER cmdBuffer) = 0;
+
     _MI_CMD_DEF(_MHW_CMD_ALL_DEF_FOR_ITF);
 MEDIA_CLASS_DEFINE_END(mhw__mi__Itf)
 };
diff --git a/media_softlet/agnostic/common/hw/mhw_render_cmdpar.h b/media_softlet/agnostic/common/hw/mhw_render_cmdpar.h
index 157454f..c58415a 100644
--- a/media_softlet/agnostic/common/hw/mhw_render_cmdpar.h
+++ b/media_softlet/agnostic/common/hw/mhw_render_cmdpar.h
@@ -86,6 +86,14 @@
     MHW_WALKER_MODE_OCT      = 8     // may apply in future Gen media architectures
 };
 
+enum MHW_EMIT_LOCAL_MODE
+{
+    MHW_EMIT_LOCAL_NONE = 0,
+    MHW_EMIT_LOCAL_X    = 1,
+    MHW_EMIT_LOCAL_XY   = 3,
+    MHW_EMIT_LOCAL_XYZ  = 7
+};
+
 struct MHW_RENDER_ENGINE_CAPS
 {
     uint32_t               dwMaxUnormSamplers              = 0;                    // Max UNORM Sampler States supported
@@ -377,11 +385,18 @@
     MemoryBlock               *memoryBlock                  = nullptr; //! Memory block associated with the state heap
     MOS_RESOURCE              *postsyncResource             = nullptr;
     uint32_t                  resourceOffset                = 0;
+    bool                      isEmitInlineParameter         = false;
+    uint32_t                  inlineDataLength              = 0;
+    uint8_t                   *inlineData                   = nullptr;
+    bool                      isGenerateLocalId             = false;
+    MHW_EMIT_LOCAL_MODE       emitLocal                     = MHW_EMIT_LOCAL_NONE;
+    
 };
 
 struct _MHW_PAR_T(STATE_COMPUTE_MODE)
 {
     bool enableLargeGrf = false;
+    uint32_t forceEuThreadSchedulingMode = 0;
 };
 
 }  // namespace render
diff --git a/media_softlet/agnostic/common/hw/mhw_sfc_cmdpar.h b/media_softlet/agnostic/common/hw/mhw_sfc_cmdpar.h
index c6affed..7fe7a48 100644
--- a/media_softlet/agnostic/common/hw/mhw_sfc_cmdpar.h
+++ b/media_softlet/agnostic/common/hw/mhw_sfc_cmdpar.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2022, Intel Corporation
+* Copyright (c) 2022-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -141,7 +141,7 @@
     bool bCSCEnable                             = false;  // YUV->RGB/YUV->YUV CSC enable
     bool bRGBASwapEnable                        = false;  // R, B Channel Swap enable
     bool bInputColorSpace                       = false;  //0: YUV color space, 1:RGB color space
-
+    bool isFullRgbG10P709                       = false;  // Whether output colorspace is COLOR_SPACE_RGB_FULL_G10_NONE_P709
     // Memory compression Enable Flag
     bool bMMCEnable                             = false;            // Flag used to decide whether sfc output should be compressed
     MOS_RESOURCE_MMC_MODE MMCMode               = MOS_MMC_DISABLED; // Memory compression mode
@@ -188,11 +188,14 @@
     uint32_t      bottomFieldVerticalScalingOffset = 0;  // Bottom field vertical scaling offset
     PMOS_RESOURCE tempFieldResource = nullptr;           // Temp filed surface
 
+    PMOS_RESOURCE sfcIndirectState  = nullptr;
+
     PMOS_RESOURCE pOsResAVSLineBufferSplit[MHW_SFC_MAX_PIPE_NUM] = {};  //!< AVS Line buffer used by SFC
     PMOS_RESOURCE pOsResIEFLineBufferSplit[MHW_SFC_MAX_PIPE_NUM] = {};  //!< IEF Line buffer used by SFC
     PMHW_SFC_OUT_SURFACE_PARAMS             pOutSurface = nullptr;
     uint32_t      av1TileRowNumber                               = 0;
     uint32_t      av1TileColumnNumber                            = 0;
+    bool          isDemosaicEnabled                              = false;  //!< Enable Demosaic
 };
 
 struct _MHW_PAR_T(SFC_AVS_STATE)
diff --git a/media_softlet/agnostic/common/hw/mhw_sfc_impl.h b/media_softlet/agnostic/common/hw/mhw_sfc_impl.h
index d8ff65d..2bb228b 100644
--- a/media_softlet/agnostic/common/hw/mhw_sfc_impl.h
+++ b/media_softlet/agnostic/common/hw/mhw_sfc_impl.h
@@ -97,6 +97,9 @@
         m_histogramBufferCtrl.Value = osItf->pfnCachePolicyGetMemoryObject(
             MOS_CODEC_RESOURCE_USAGE_SURFACE_UNCACHED,
             osItf->pfnGetGmmClientContext(osItf)).DwordValue;
+        m_sfcIndirectBufferCtrl.Value = osItf->pfnCachePolicyGetMemoryObject(
+            MOS_CODEC_RESOURCE_USAGE_SURFACE_UNCACHED,
+            osItf->pfnGetGmmClientContext(osItf)).DwordValue;
 
         m_maxWidth  = MHW_SFC_MAX_WIDTH;
         m_maxHeight = MHW_SFC_MAX_HEIGHT;
@@ -762,6 +765,7 @@
     MHW_MEMORY_OBJECT_CONTROL_PARAMS   m_iefLineTileBufferCtrl = {};   // IEF Line Tile Buffer caching control bits
     MHW_MEMORY_OBJECT_CONTROL_PARAMS   m_sfdLineTileBufferCtrl = {};   // SFD Line Tile Buffer caching control bits
     MHW_MEMORY_OBJECT_CONTROL_PARAMS   m_histogramBufferCtrl   = {};   // Histogram Buffer caching control bits
+    MHW_MEMORY_OBJECT_CONTROL_PARAMS   m_sfcIndirectBufferCtrl = {};   // SfcIndirect Buffer caching control bits
     MHW_SCALING_MODE                   m_scalingMode           = MHW_SCALING_NEAREST;
 MEDIA_CLASS_DEFINE_END(mhw__sfc__Impl)
 };
diff --git a/media_softlet/agnostic/common/hw/mhw_vebox_cmdpar.h b/media_softlet/agnostic/common/hw/mhw_vebox_cmdpar.h
index 521b003..864c7fe 100644
--- a/media_softlet/agnostic/common/hw/mhw_vebox_cmdpar.h
+++ b/media_softlet/agnostic/common/hw/mhw_vebox_cmdpar.h
@@ -554,6 +554,7 @@
     MHW_VEBOX_MODE                   VeboxMode                   = {};
     MHW_VEBOX_CHROMA_SAMPLING        ChromaSampling              = {};
     MHW_VEBOX_3D_LUT                 LUT3D                       = {};
+    MHW_VEBOX_FP16_INPUT             FP16Input                   = {};
     bool                             bUseVeboxHeapKernelResource = false;
     PMOS_RESOURCE                    pLaceLookUpTables           = nullptr;
     PMOS_RESOURCE                    pVeboxParamSurf             = nullptr;
@@ -563,6 +564,7 @@
     MHW_MEMORY_OBJECT_CONTROL_PARAMS LaceLookUpTablesSurfCtrl    = {};
     MHW_MEMORY_OBJECT_CONTROL_PARAMS Vebox3DLookUpTablesSurfCtrl = {};
     bool                             bNoUseVeboxHeap             = false;
+    bool                             isTlbPrefetchDisable        = false;
     bool                             bCmBuffer                   = false;
 };
 
diff --git a/media_softlet/agnostic/common/hw/mhw_vebox_impl.h b/media_softlet/agnostic/common/hw/mhw_vebox_impl.h
index 38318e8..f4c1127 100644
--- a/media_softlet/agnostic/common/hw/mhw_vebox_impl.h
+++ b/media_softlet/agnostic/common/hw/mhw_vebox_impl.h
@@ -940,6 +940,16 @@
         return MOS_STATUS_SUCCESS;
     }
 
+    MOS_STATUS AddEOTFState(void *&surface, PMHW_1DLUT_PARAMS p1DLutParams) override
+    {
+        return MOS_STATUS_SUCCESS;
+    }
+
+    MOS_STATUS AddFP16State(PMHW_FP16_PARAMS pFP16Params) override
+    {
+        return MOS_STATUS_SUCCESS;
+    }
+
     _MHW_SETCMD_OVERRIDE_DECL(VEBOX_SURFACE_STATE)
     {
         _MHW_SETCMD_CALLBASE(VEBOX_SURFACE_STATE);
diff --git a/media_softlet/agnostic/common/hw/mhw_vebox_itf.h b/media_softlet/agnostic/common/hw/mhw_vebox_itf.h
index 1047757..db55f71 100644
--- a/media_softlet/agnostic/common/hw/mhw_vebox_itf.h
+++ b/media_softlet/agnostic/common/hw/mhw_vebox_itf.h
@@ -110,6 +110,10 @@
 
     virtual MOS_STATUS Add1DLutState(void *&surface, PMHW_1DLUT_PARAMS p1DLutParams) = 0;
 
+    virtual MOS_STATUS AddEOTFState(void *&surface, PMHW_1DLUT_PARAMS p1DLutParams) = 0;
+
+    virtual MOS_STATUS AddFP16State(PMHW_FP16_PARAMS pFP16Params) = 0;
+
     _VEBOX_CMD_DEF(_MHW_CMD_ALL_DEF_FOR_ITF);
 
 MEDIA_CLASS_DEFINE_END(mhw__vebox__Itf)
diff --git a/media_softlet/agnostic/common/hw/vdbox/mhw_vdbox_vdenc_cmdpar.h b/media_softlet/agnostic/common/hw/vdbox/mhw_vdbox_vdenc_cmdpar.h
index fd75099..6127edd 100644
--- a/media_softlet/agnostic/common/hw/vdbox/mhw_vdbox_vdenc_cmdpar.h
+++ b/media_softlet/agnostic/common/hw/vdbox/mhw_vdbox_vdenc_cmdpar.h
@@ -326,6 +326,7 @@
     uint32_t VdencHEVCVP9TileSlicePar22    = 0;
     uint32_t VdencHEVCVP9TileSlicePar23    = 0;
     uint32_t VdencHEVCVP9TileSlicePar24    = 0;
+    uint32_t tileRowstoreOffset            = 0;
 };
 
 struct _MHW_PAR_T(VDENC_WALKER_STATE)
diff --git a/media_softlet/agnostic/common/hw/vdbox/mhw_vdbox_vdenc_impl.h b/media_softlet/agnostic/common/hw/vdbox/mhw_vdbox_vdenc_impl.h
index adb8396..e0ad7d2 100644
--- a/media_softlet/agnostic/common/hw/vdbox/mhw_vdbox_vdenc_impl.h
+++ b/media_softlet/agnostic/common/hw/vdbox/mhw_vdbox_vdenc_impl.h
@@ -1146,7 +1146,7 @@
     DO_FIELD(DW6, TileStreaminOffset, params.tileStreamInOffset);                                                         \
                                                                                                                           \
     DO_FIELD(DW7, RowStoreOffsetEnable, cmd.DW4.TileStartCtbY == 0 ? params.tileEnable : 0);                              \
-    DO_FIELD(DW7, TileRowstoreOffset, cmd.DW4.TileStartCtbY == 0 ? cmd.DW4.TileStartCtbX / 32 : 0);                       \
+    DO_FIELD(DW7, TileRowstoreOffset, params.tileRowstoreOffset);                                                         \
                                                                                                                           \
     DO_FIELD(DW8, TileStreamoutOffsetEnable, params.tileEnable);                                                          \
     DO_FIELD(DW8, TileStreamoutOffset, params.tileId * 19);                                                               \
diff --git a/media_softlet/agnostic/common/os/mos_interface.h b/media_softlet/agnostic/common/os/mos_interface.h
index 0acd88a..80efdf8 100644
--- a/media_softlet/agnostic/common/os/mos_interface.h
+++ b/media_softlet/agnostic/common/os/mos_interface.h
@@ -55,6 +55,7 @@
 class GpuContextSpecificNext;
 struct _MOS_VIRTUALENGINE_SET_PARAMS;
 struct _MOS_VIRTUALENGINE_INIT_PARAMS;
+struct SYNC_FENCE_INFO_TRINITY;
 
 typedef struct _MOS_VIRTUALENGINE_SET_PARAMS  MOS_VIRTUALENGINE_SET_PARAMS, *PMOS_VIRTUALENGINE_SET_PARAMS;
 typedef struct _MOS_VIRTUALENGINE_INIT_PARAMS MOS_VIRTUALENGINE_INIT_PARAMS, *PMOS_VIRTUALENGINE_INIT_PARAMS;
@@ -482,6 +483,13 @@
     //!
     //! \brief    Dump Indirect state in Command Buffer
     //!
+    static MOS_STATUS DumpIndirectStates(
+        MOS_STREAM_HANDLE streamState,
+        const char        *filePathPrefix,
+        std::time_t       currentTime);
+    //!
+    //! \brief    Dump Indirect state in Command Buffer
+    //!
     //! \param    [in] streamState
     //!           Handle of Os Stream State
     //! \param    [in] cmdBuffer
@@ -494,7 +502,7 @@
     //! \return   MOS_STATUS
     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
     //!
-    static MOS_STATUS DumpIndirectState(
+    static MOS_STATUS DumpBindingTable(
         MOS_STREAM_HANDLE     streamState,
         COMMAND_BUFFER_HANDLE cmdBuffer,
         MOS_GPU_NODE          gpuNode,
@@ -1411,18 +1419,21 @@
     //!           GPU Context handle of current GPU which requesting to use the resoure and find the hazard to wait the busy context.
     //! \param    [in] osRequestorHandle
     //!           OS runtime handle of requestor context
+    //! \param    [in,out] fenceInfoTrinity
+    //!           if need to sync, it is fence handle and fence value
     //!
     //! \return   MOS_STATUS
     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
     //!
-    static MOS_STATUS ResourceSyncCallback(    
+    static MOS_STATUS ResourceSyncCallback(
         OsSpecificRes          resource,
         MOS_DEVICE_HANDLE      deviceContext,
         uint32_t               index,
         SYNC_HAZARD            hazardType,
         GPU_CONTEXT_HANDLE     busyCtx,
         GPU_CONTEXT_HANDLE     requestorCtx,
-        OS_HANDLE              osRequestorHandle);
+        OS_HANDLE              osRequestorHandle,
+        SYNC_FENCE_INFO_TRINITY *fenceInfoTrinity);
 
     //!
     //! \brief    Lock Sync Callback between Media and 3D
diff --git a/media_softlet/agnostic/common/os/mos_os.cpp b/media_softlet/agnostic/common/os/mos_os.cpp
index ebd4ac8..de6e24d 100644
--- a/media_softlet/agnostic/common/os/mos_os.cpp
+++ b/media_softlet/agnostic/common/os/mos_os.cpp
@@ -461,6 +461,29 @@
     return MOS_STATUS_SUCCESS;
 }
 
+void Mos_AddIndirectState(
+    PMOS_INTERFACE      pOsInterface,
+    uint32_t            stateSize,
+    uint32_t            *pIndirectState,
+    uint32_t            *gfxAddressBottom,
+    uint32_t            *gfxAddressTop,
+    const char          *stateName)
+{
+    MOS_OS_CHK_NULL_NO_STATUS_RETURN(pOsInterface);
+    if (pOsInterface->apoMosEnabled)
+    {
+        MOS_OS_CHK_NULL_NO_STATUS_RETURN(pOsInterface->osStreamState);
+        INDIRECT_STATE_INFO stateinfoarray = {};
+        stateinfoarray.stateSize           = stateSize;
+        stateinfoarray.indirectState       = pIndirectState;
+        stateinfoarray.gfxAddressBottom    = gfxAddressBottom;
+        stateinfoarray.gfxAddressTop       = gfxAddressTop;
+        stateinfoarray.stateName           = stateName;
+        pOsInterface->osStreamState->indirectStateInfo.push_back(stateinfoarray);
+    }
+    return;
+}
+
 //!
 //! \brief    Dump command buffers
 //! \details  This function dumps the command buffer just before rendering it to the GPU.
@@ -648,6 +671,7 @@
 
     // Setup member function and variable.
     pOsInterface->pfnDumpCommandBuffer  = Mos_DumpCommandBuffer;
+    pOsInterface->pfnAddIndirectState   = Mos_AddIndirectState;
 
     // Check if command buffer dump was enabled in user feature.
     ReadUserSetting(
diff --git a/media_softlet/agnostic/common/os/mos_user_setting.cpp b/media_softlet/agnostic/common/os/mos_user_setting.cpp
index 4d06b5c..e00f895 100644
--- a/media_softlet/agnostic/common/os/mos_user_setting.cpp
+++ b/media_softlet/agnostic/common/os/mos_user_setting.cpp
@@ -182,21 +182,21 @@
         userSettingPtr,
         __MEDIA_USER_FEATURE_VALUE_IP_ALIGNMENT_DECODE_TIMEOUT,
         MediaUserSetting::Group::Device,
-        20,
+        12,
         false);
 
     DeclareUserSettingKey(
         userSettingPtr,
         __MEDIA_USER_FEATURE_VALUE_IP_ALIGNMENT_ENCODE_TIMEOUT,
         MediaUserSetting::Group::Device,
-        20,
+        12,
         false);
 
     DeclareUserSettingKey(
         userSettingPtr,
         __MEDIA_USER_FEATURE_VALUE_IP_ALIGNMENT_VPP_TIMEOUT,
         MediaUserSetting::Group::Device,
-        20,
+        12,
         false);
 
     DeclareUserSettingKey(  //TRUE for Enabling Vebox Scalability. (Default FALSE: disabled")
@@ -921,6 +921,13 @@
 
     DeclareUserSettingKeyForDebug(
         userSettingPtr,
+        __MEDIA_USER_FEATURE_VALUE_FORCE_MEDIA_COMPRESSED_WRITE,
+        MediaUserSetting::Group::Device,
+        0,
+        true); //"If enabled, then to disable Unifined CMF."
+
+    DeclareUserSettingKeyForDebug(
+        userSettingPtr,
         __MEDIA_USER_FEATURE_VALUE_FORCE_RESET_THRESHOLD,
         MediaUserSetting::Group::Device,
         0,
diff --git a/media_softlet/agnostic/common/renderhal/renderhal.cpp b/media_softlet/agnostic/common/renderhal/renderhal.cpp
index 7d200de..8c33768 100644
--- a/media_softlet/agnostic/common/renderhal/renderhal.cpp
+++ b/media_softlet/agnostic/common/renderhal/renderhal.cpp
@@ -5589,6 +5589,27 @@
     RcsSurfaceParams.psSurface             = &pRenderHalSurface->OsSurface;
     RcsSurfaceParams.dwOffsetInSSH         = pSurfaceEntry->dwSurfStateOffset;
     RcsSurfaceParams.dwCacheabilityControl = pRenderHal->pfnGetSurfaceMemoryObjectControl(pRenderHal, pParams);
+    if (pParams->surfaceType)
+    {
+        MOS_CACHE_ELEMENT element(MOS_CODEC_RESOURCE_USAGE_BEGIN_CODEC, MOS_CODEC_RESOURCE_USAGE_BEGIN_CODEC);
+        bool              res = pRenderHal->pOsInterface->pfnGetCacheSetting(pParams->Component, pParams->surfaceType, pParams->isOutput, RENDER_ENGINE, element, false);
+        if (res)
+        {
+            RcsSurfaceParams.dwCacheabilityControl = (pRenderHal->pOsInterface->pfnCachePolicyGetMemoryObject(
+                                      element.mocsUsageType,
+                                      pRenderHal->pOsInterface->pfnGetGmmClientContext(pRenderHal->pOsInterface)))
+                                     .DwordValue;
+        }
+        else
+        {
+            MHW_RENDERHAL_ASSERTMESSAGE("Not found cache settings!");
+        }
+    }
+    else
+    {
+        MHW_RENDERHAL_NORMALMESSAGE("Not implemented yet! Will use MemObjCtl value %d", pParams->MemObjCtl);
+    }
+
     RcsSurfaceParams.bIsWritable           = pParams->isOutput;
     RcsSurfaceParams.bRenderTarget         = pParams->isOutput;
 
@@ -6239,9 +6260,10 @@
 
     bRet = (!MOS_IS_ALIGNED(dwSurfaceHeight, heightAlignUnit) || !MOS_IS_ALIGNED(dwSurfaceWidth, widthAlignUnit));
 
-    // Note: Always using 2 plane NV12 as WA for the corruption of NV12 input
-    // of which the height is greater than 16352
-    bRet = bRet || (MEDIA_IS_WA(pRenderHal->pWaTable, Wa16KInputHeightNV12Planar420) && dwSurfaceHeight > 16352);
+    // Note: Always using 2 plane NV12 as WA for the corruption of NV12 input, of which the height is greater than 16352
+    // For 16k case, the height (16384) > 16383 which is the maximum capacity of DW (13:0).
+    // Gmm (OS level) need 32 aligned for planar height in the driver and we are processing height as 16384 for the height from 16353 to 16384.
+    bRet = bRet || (dwSurfaceHeight > 16352);
 
     return bRet;
 }
@@ -6437,7 +6459,10 @@
         bool              res = pRenderHal->pOsInterface->pfnGetCacheSetting(pParams->Component, pParams->surfaceType, pParams->isOutput, RENDER_ENGINE, element, false);
         if (res)
         {
-            pParams->MemObjCtl = element.mocsUsageType;
+            pParams->MemObjCtl = (pRenderHal->pOsInterface->pfnCachePolicyGetMemoryObject(
+                                                            element.mocsUsageType,
+                                                            pRenderHal->pOsInterface->pfnGetGmmClientContext(pRenderHal->pOsInterface)))
+                                                            .DwordValue;
         }
         else
         {
diff --git a/media_softlet/agnostic/common/renderhal/renderhal_platform_interface_next.cpp b/media_softlet/agnostic/common/renderhal/renderhal_platform_interface_next.cpp
index 2b373d3..e2f2fef 100644
--- a/media_softlet/agnostic/common/renderhal/renderhal_platform_interface_next.cpp
+++ b/media_softlet/agnostic/common/renderhal/renderhal_platform_interface_next.cpp
@@ -1155,7 +1155,20 @@
                                        pGpGpuWalkerParams->InterfaceDescriptorOffset * pRenderHal->pStateHeap->dwSizeSamplers;
     mhwIdEntryParams.dwBindingTableOffset          = pGpGpuWalkerParams->BindingTableID * pRenderHal->pStateHeap->iBindingTableSize;
     mhwIdEntryParams.dwSharedLocalMemorySize       = pGpGpuWalkerParams->SLMSize;
-    mhwIdEntryParams.dwNumberofThreadsInGPGPUGroup = pGpGpuWalkerParams->ThreadWidth * pGpGpuWalkerParams->ThreadHeight;
+    if (pGpGpuWalkerParams->isGenerateLocalID && pGpGpuWalkerParams->emitLocal != MHW_EMIT_LOCAL_NONE)
+    {
+        //When COMPUTE_WALKER Emit Local ID is enabled, thread group number need to divide MHW_RENDER_ENGINE_NUMBER_OF_THREAD_UNIT
+        mhwIdEntryParams.dwNumberofThreadsInGPGPUGroup = pGpGpuWalkerParams->ThreadWidth * pGpGpuWalkerParams->ThreadHeight / MHW_RENDER_ENGINE_NUMBER_OF_THREAD_UNIT;
+        if (mhwIdEntryParams.dwNumberofThreadsInGPGPUGroup > MHW_RENDER_ENGINE_MAX_NUMBER_OF_THREAD)
+        {
+            MHW_RENDERHAL_ASSERTMESSAGE("Number of Threads In GpGpuGroup %d Exceeds the Max Number %d", mhwIdEntryParams.dwNumberofThreadsInGPGPUGroup, MHW_RENDER_ENGINE_MAX_NUMBER_OF_THREAD);
+            MHW_RENDERHAL_CHK_STATUS_RETURN(MOS_STATUS_INVALID_PARAMETER);
+        }
+    }
+    else
+    {
+        mhwIdEntryParams.dwNumberofThreadsInGPGPUGroup = pGpGpuWalkerParams->ThreadWidth * pGpGpuWalkerParams->ThreadHeight;
+    }
     //This only a WA to disable EU fusion for multi-layer blending cases or single layer do colorfill and rotation together.
     //Need remove it after kernel or compiler fix it.
     mhwIdEntryParams.bBarrierEnable              = pRenderHal->eufusionBypass ? 1 : 0;
@@ -1491,6 +1504,16 @@
         params.GroupDepth = 1;
     }
 
+    params.isEmitInlineParameter = m_gpgpuWalkerParams->isEmitInlineParameter;
+    if (m_gpgpuWalkerParams->inlineDataLength > 0 && m_gpgpuWalkerParams->inlineData)
+    {
+        params.inlineDataLength = m_gpgpuWalkerParams->inlineDataLength;
+        params.inlineData       = m_gpgpuWalkerParams->inlineData;
+    }
+
+    params.isGenerateLocalId = m_gpgpuWalkerParams->isGenerateLocalID;
+    params.emitLocal         = mhw::render::MHW_EMIT_LOCAL_MODE(m_gpgpuWalkerParams->emitLocal);
+
     return MOS_STATUS_SUCCESS;
 }
 
@@ -1503,4 +1526,4 @@
     params.mocs4SurfaceState = pStateBaseParams->mocs4SurfaceState;
 
     return MOS_STATUS_SUCCESS;
-}
\ No newline at end of file
+}
diff --git a/media_softlet/agnostic/common/shared/features/media_feature_manager.h b/media_softlet/agnostic/common/shared/features/media_feature_manager.h
index 814bb93..fe1d0fd 100644
--- a/media_softlet/agnostic/common/shared/features/media_feature_manager.h
+++ b/media_softlet/agnostic/common/shared/features/media_feature_manager.h
@@ -261,6 +261,13 @@
     //!
     virtual MOS_STATUS CheckFeatures(void *params) { return MOS_STATUS_SUCCESS; };
 
+    //!
+    //! \brief  Get DDI Target Usage
+    //! \return uint8_t
+    //!         return the DDI target usage.
+    //!
+    uint8_t GetDDITargetUsage(){return m_ddiTargetUsage;}
+
 protected:
 
     //!
@@ -290,6 +297,7 @@
     std::map<int, std::vector<int>> m_packetIdList;  // map feature ID to a vector of packet ID
     std::map<int, LIST_TYPE> m_packetIdListTypes;  // map feature ID to a flag, indicates whether packet ID vector is a block list or an allow list
     MediaFeatureConstSettings *m_featureConstSettings = nullptr;
+    uint8_t m_ddiTargetUsage = 0; // for user input setting report
     uint8_t m_targetUsage = 0;
     uint8_t m_passNum = 1;
     // Media user setting instance
diff --git a/media_softlet/agnostic/common/shared/mediacopy/media_blt_copy_next.cpp b/media_softlet/agnostic/common/shared/mediacopy/media_blt_copy_next.cpp
index 1099d76..105484f 100644
--- a/media_softlet/agnostic/common/shared/mediacopy/media_blt_copy_next.cpp
+++ b/media_softlet/agnostic/common/shared/mediacopy/media_blt_copy_next.cpp
@@ -655,8 +655,7 @@
     // A workaround for oversized buffers.
     // BLOCK_COPY_BLT can only receive (width-1) of up to 14 bits.
     // The width of the internal buffer of a staging texture may exceed that limit.
-    if (m_blokCopyon &&
-        (src->pGmmResInfo->GetResourceType() == RESOURCE_BUFFER) &&
+    if ((src->pGmmResInfo->GetResourceType() == RESOURCE_BUFFER) &&
         (dst->pGmmResInfo->GetResourceType() == RESOURCE_BUFFER) &&
         ((src->pGmmResInfo->GetBaseWidth() > MAX_BLT_BLOCK_COPY_WIDTH) || (dst->pGmmResInfo->GetBaseWidth() > MAX_BLT_BLOCK_COPY_WIDTH)))
     {
@@ -681,6 +680,8 @@
 //!           [in] Pointer to input surface
 //! \param    outputSurface
 //!           [in] Pointer to output surface
+//! \param    planeIndex
+//!           [in] Pointer to YUV(RGB) plane index
 //! \return   MOS_STATUS
 //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
 //!
@@ -694,8 +695,9 @@
     BLT_CHK_NULL_RETURN(inputSurface);
     BLT_CHK_NULL_RETURN(outputSurface);
     BLT_CHK_NULL_RETURN(outputSurface->pGmmResInfo);
+    BLT_CHK_NULL_RETURN(inputSurface->pGmmResInfo);
 
-    uint32_t          BytesPerTexel = 1;
+    PGMM_RESOURCE_INFO TiledRsInfo   = nullptr;
     MOS_SURFACE       ResDetails;
     MOS_ZeroMemory(&ResDetails, sizeof(MOS_SURFACE));
     MOS_ZeroMemory(pMhwBltParams, sizeof(MHW_FAST_COPY_BLT_PARAM));
@@ -707,12 +709,14 @@
     uint32_t inputPitch  = ResDetails.dwPitch;
 
     if (inputSurface->TileType != MOS_TILE_LINEAR)
-    { 
+    { //for tiled surfaces, pitch is expressed in DWORDs
         pMhwBltParams->dwSrcPitch = ResDetails.dwPitch / 4;
+        TiledRsInfo               = inputSurface->pGmmResInfo;
     }
     else
     {
         pMhwBltParams->dwSrcPitch = ResDetails.dwPitch;
+        TiledRsInfo               = outputSurface->pGmmResInfo;
     }
     
     pMhwBltParams->dwSrcTop    = ResDetails.RenderOffset.YUV.Y.YOffset;
@@ -727,7 +731,7 @@
     uint32_t outputPitch  = ResDetails.dwPitch;
 
     if (outputSurface->TileType != MOS_TILE_LINEAR)
-    {
+    {// for tiled surfaces, pitch is expressed in DWORDs
         pMhwBltParams->dwDstPitch = ResDetails.dwPitch/4;
     }
     else
@@ -738,48 +742,20 @@
     pMhwBltParams->dwDstLeft   = ResDetails.RenderOffset.YUV.Y.XOffset;
 
     int planeNum = GetPlaneNum(ResDetails.Format);
-    pMhwBltParams->dwDstRight = std::min(inputWidth, outputWidth);
+    pMhwBltParams->dwPlaneIndex = planeIndex;
+    pMhwBltParams->dwPlaneNum   = planeNum;
 
-    if (outputSurface->pGmmResInfo->GetResourceType() != RESOURCE_BUFFER)
-    {
-        BytesPerTexel = outputSurface->pGmmResInfo->GetBitsPerPixel() / 8;  // using Bytes.
+    uint32_t BitsPerBlock = TiledRsInfo->GetBitsPerPixel();  // using Bit.
+    pMhwBltParams->dwColorDepth = GetBlkCopyColorDepth(TiledRsInfo->GetResourceFormat(), BitsPerBlock);
+    pMhwBltParams->dwDstRight   = std::min(inputWidth, outputWidth);
+    pMhwBltParams->dwDstBottom  = std::min(inputHeight, outputHeight);
 
-        if (ResDetails.Format == Format_P010 || ResDetails.Format == Format_P016)
-        {
-            BytesPerTexel = 2;
-        }
-    }
-
-    if (true == m_blokCopyon)
-    {
-        pMhwBltParams->dwColorDepth = GetBlkCopyColorDepth(outputSurface->pGmmResInfo->GetResourceFormat(), BytesPerTexel);
-    }
-    else
-    {
-        pMhwBltParams->dwColorDepth = GetFastCopyColorDepth(outputSurface->pGmmResInfo->GetResourceFormat(), BytesPerTexel);
-    }
-
-    if( 1 == planeNum )
-    {// handle as whole memory
-       pMhwBltParams->dwDstBottom = std::min(inputHeight, outputHeight);
-       if (false == m_blokCopyon)
-       {// fastcopy
-           pMhwBltParams->dwDstRight   = std::min(inputPitch, outputPitch) / 4;  // Regard as 32 bit per pixel format, i.e. 4 byte per pixel.
-           pMhwBltParams->dwColorDepth = 3;  //0:8bit 1:16bit 3:32bit 4:64bit
-       }
-       else
-       {
-           // Block copy
-           pMhwBltParams->dwDstRight = std::min(inputPitch, outputPitch) / 4;  // Regard as 32 bit per pixel format, i.e. 4 byte per pixel.
-           pMhwBltParams->dwColorDepth = 2;  //0:8bit 1:16bit 2:32bit
-       }
-    }
-    else
+    // The 2nd and 3nd layer.
+    if (planeNum == TWO_PLANES || planeNum == THREE_PLANES)
     {
         int bytePerTexelScaling    = GetBytesPerTexelScaling(ResDetails.Format);
-        pMhwBltParams->dwDstBottom = std::min(inputHeight, outputHeight);
 
-        if (1 == planeIndex || 2 == planeIndex)
+        if (MCPY_PLANE_U == planeIndex || MCPY_PLANE_V == planeIndex)
         {
            pMhwBltParams->dwDstBottom = pMhwBltParams->dwDstBottom / bytePerTexelScaling;
            if (ResDetails.Format == Format_I420 || ResDetails.Format == Format_YV12)
@@ -793,8 +769,8 @@
     }
     pMhwBltParams->pSrcOsResource = inputSurface;
     pMhwBltParams->pDstOsResource = outputSurface;
-    MCPY_NORMALMESSAGE("BLT params: m_blokCopyon = %d, format %d, planeNum %d, planeIndex %d, dwColorDepth %d, dwSrcTop %d, dwSrcLeft %d, dwSrcPitch %d,"
-                       "dwDstTop %d, dwDstLeft %d, dwDstRight %d, dwDstBottom %d, dwDstPitch %d", m_blokCopyon,
+    MCPY_NORMALMESSAGE("BLT params:format %d, planeNum %d, planeIndex %d, dwColorDepth %d, dwSrcTop %d, dwSrcLeft %d, dwSrcPitch %d,"
+                       "dwDstTop %d, dwDstLeft %d, dwDstRight %d, dwDstBottom %d, dwDstPitch %d",
                        ResDetails.Format, planeNum, planeIndex, pMhwBltParams->dwColorDepth, pMhwBltParams->dwSrcTop, pMhwBltParams->dwSrcLeft,
                        pMhwBltParams->dwSrcPitch, pMhwBltParams->dwDstTop, pMhwBltParams->dwDstLeft, pMhwBltParams->dwDstRight, 
                        pMhwBltParams->dwDstBottom, pMhwBltParams->dwDstPitch);
@@ -866,7 +842,7 @@
             &fastCopyBltParam,
             pBltStateParam->pSrcSurface,
             pBltStateParam->pDstSurface,
-            0));
+            MCPY_PLANE_Y));
 
         auto& Register = m_miItf->MHW_GETPAR_F(MI_LOAD_REGISTER_IMM)();
         Register = {};
@@ -883,74 +859,40 @@
         Register.dwData = swctrl.DW0.Value;
         BLT_CHK_STATUS_RETURN(m_miItf->MHW_ADDCMD_F(MI_LOAD_REGISTER_IMM)(&cmdBuffer));
 
-        if (m_blokCopyon)
-        {
-            BLT_CHK_STATUS_RETURN(m_bltItf->AddBlockCopyBlt(
-                &cmdBuffer,
-                &fastCopyBltParam,
-                srcResDetails.YPlaneOffset.iSurfaceOffset,
-                dstResDetails.YPlaneOffset.iSurfaceOffset));
-        }
-        else
-        {
-            BLT_CHK_STATUS_RETURN(m_bltItf->AddFastCopyBlt(
-                &cmdBuffer,
-                &fastCopyBltParam,
-                srcResDetails.YPlaneOffset.iSurfaceOffset,
-                dstResDetails.YPlaneOffset.iSurfaceOffset));
-        }
-        if (planeNum >= 2)
+        BLT_CHK_STATUS_RETURN(m_miItf->AddBLTMMIOPrologCmd(&cmdBuffer));
+        BLT_CHK_STATUS_RETURN(m_bltItf->AddBlockCopyBlt(
+            &cmdBuffer,
+            &fastCopyBltParam,
+            srcResDetails.YPlaneOffset.iSurfaceOffset,
+            dstResDetails.YPlaneOffset.iSurfaceOffset));
+
+        if (planeNum == TWO_PLANES || planeNum == THREE_PLANES)
         {
             BLT_CHK_STATUS_RETURN(SetupBltCopyParam(
              &fastCopyBltParam,
              pBltStateParam->pSrcSurface,
              pBltStateParam->pDstSurface,
-             1));
-            if (m_blokCopyon)
-            {
-                BLT_CHK_STATUS_RETURN(m_bltItf->AddBlockCopyBlt(
+             MCPY_PLANE_U));
+             BLT_CHK_STATUS_RETURN(m_bltItf->AddBlockCopyBlt(
                     &cmdBuffer,
                     &fastCopyBltParam,
                     srcResDetails.UPlaneOffset.iSurfaceOffset,
                     dstResDetails.UPlaneOffset.iSurfaceOffset));
-            }
-            else
-            {
-                BLT_CHK_STATUS_RETURN(m_bltItf->AddFastCopyBlt(
-                    &cmdBuffer,
-                    &fastCopyBltParam,
-                    srcResDetails.UPlaneOffset.iSurfaceOffset,
-                    dstResDetails.UPlaneOffset.iSurfaceOffset));
-            }
-            if (planeNum == 3)
+
+            if (planeNum == THREE_PLANES)
             {
                 BLT_CHK_STATUS_RETURN(SetupBltCopyParam(
                     &fastCopyBltParam,
                     pBltStateParam->pSrcSurface,
                     pBltStateParam->pDstSurface,
-                    2));
-                if (m_blokCopyon)
-                {
-                    BLT_CHK_STATUS_RETURN(m_bltItf->AddBlockCopyBlt(
-                        &cmdBuffer,
-                        &fastCopyBltParam,
-                        srcResDetails.VPlaneOffset.iSurfaceOffset,
-                        dstResDetails.VPlaneOffset.iSurfaceOffset));
-                }
-                else
-                {
-                    BLT_CHK_STATUS_RETURN(m_bltItf->AddFastCopyBlt(
-                        &cmdBuffer,
-                        &fastCopyBltParam,
-                        srcResDetails.VPlaneOffset.iSurfaceOffset,
-                        dstResDetails.VPlaneOffset.iSurfaceOffset));
-                }
+                    MCPY_PLANE_V));
+                BLT_CHK_STATUS_RETURN(m_bltItf->AddBlockCopyBlt(
+                    &cmdBuffer,
+                    &fastCopyBltParam,
+                    srcResDetails.VPlaneOffset.iSurfaceOffset,
+                    dstResDetails.VPlaneOffset.iSurfaceOffset));
             }
-            else if(planeNum > 3)
-            {
-                MCPY_ASSERTMESSAGE("illegal usage");
-                return MOS_STATUS_INVALID_PARAMETER;
-            }
+
          }
     }
     BLT_CHK_STATUS_RETURN(perfProfiler->AddPerfCollectEndCmd((void*)this, m_osInterface, m_miItf, &cmdBuffer));
@@ -978,79 +920,47 @@
 
 uint32_t BltStateNext::GetBlkCopyColorDepth(
     GMM_RESOURCE_FORMAT dstFormat,
-    uint32_t            BytesPerTexel)
+    uint32_t            BitsPerBlock)
 {
-    uint32_t bitsPerTexel = BytesPerTexel * BLT_BITS_PER_BYTE;
-
-    switch (bitsPerTexel)
+    uint32_t BitsPerPixel = BLT_BITS_PER_BYTE;
+    if (dstFormat == GMM_FORMAT_YUY2_2x1 || dstFormat == GMM_FORMAT_Y216_TYPE || dstFormat == GMM_FORMAT_Y210)
+    {// GMM_FORMAT_YUY2_2x1 32bpe 2x1 pixel blocks instead of 16bpp 1x1 block
+     // GMM_FORMAT_Y216_TYPE/Y210 64bpe pixel blocks instead of 32bpp block.
+         BitsPerPixel = BitsPerBlock / 2;
+    }
+    else
     {
-     case 8:
-         return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_8BITCOLOR;
-         break;
+         BitsPerPixel = BitsPerBlock;
+    }
+
+    switch (BitsPerPixel)
+    {
      case 16:
          switch (dstFormat)
          {
            case GMM_FORMAT_B5G5R5A1_UNORM:
                return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_32BITCOLOR;
-               break;
            default:
-               return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_16BITCOLOR;;
-               break;
+               return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_16BITCOLOR;
          }
-         break;
+     case 32:
+         return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_32BITCOLOR;
      case 64:
          return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_64BITCOLOR;
-         break;
      case 96:
-         return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_32BITCOLOR;
-         break;
+         MCPY_ASSERTMESSAGE("96 BitPerPixel support limimated as Linear format %d", dstFormat);
+         return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_96BITCOLOR_ONLYLINEARCASEISSUPPORTED;
      case 128:
          return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_128BITCOLOR;
-         break;
-     default:
-         return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_32BITCOLOR;
-         break;
-    }
- }
-
-uint32_t BltStateNext::GetFastCopyColorDepth(
-     GMM_RESOURCE_FORMAT dstFormat,
-     uint32_t            BytesPerTexel)
- {
-     uint32_t bitsPerTexel = BytesPerTexel * BLT_BITS_PER_BYTE;
-
-     switch (bitsPerTexel)
-     {
      case 8:
-         return mhw_blt_state::XY_FAST_COPY_BLT_CMD::COLOR_DEPTH_8BITCOLOR;
-         break;
-     case 16:
-         switch (dstFormat)
-         {
-         case GMM_FORMAT_B5G5R5A1_UNORM:
-             return mhw_blt_state::XY_FAST_COPY_BLT_CMD::COLOR_DEPTH_32BITCOLOR;
-             break;
-         default:
-             return mhw_blt_state::XY_FAST_COPY_BLT_CMD::COLOR_DEPTH_16BITCOLOR_565;
-             break;
-         }
-         break;
-     case 64:
-         return mhw_blt_state::XY_FAST_COPY_BLT_CMD::COLOR_DEPTH_64BITCOLOR_FOR64KBTILING;
-         break;
-     case 128:
-         return mhw_blt_state::XY_FAST_COPY_BLT_CMD::COLOR_DEPTH_128BITCOLOR_FOR64KBTILING;
-         break;
      default:
-         return mhw_blt_state::XY_FAST_COPY_BLT_CMD::COLOR_DEPTH_32BITCOLOR;
-         break;
-     }
+         return mhw_blt_state::XY_BLOCK_COPY_BLT_CMD::COLOR_DEPTH_8BITCOLOR;
+    }
  }
 
  int BltStateNext::GetBytesPerTexelScaling(MOS_FORMAT format)
 {
-  int  dstBytesPerTexel = 1;
-
+   int dstBytesPerTexel = 1;
    switch (format)
    {
         case Format_NV12:
@@ -1058,7 +968,6 @@
         case Format_P016:
             dstBytesPerTexel = 2;
            break;
-
        default:
            dstBytesPerTexel = 1;
     }
@@ -1068,14 +977,14 @@
 int BltStateNext::GetPlaneNum(MOS_FORMAT format)
 {
 
-  int  planeNum = 1;
+  int planeNum = SINGLE_PLANE;
 
    switch (format)
    {
        case Format_NV12:
        case Format_P010:
        case Format_P016:
-            planeNum = 2;
+           planeNum = TWO_PLANES;
            break;
        case Format_YV12:
        case Format_I420:
@@ -1086,10 +995,10 @@
        case Format_411P:
        case Format_422V:
        case Format_422H:
-            planeNum = 3;
+           planeNum = THREE_PLANES;
             break;
        default:
-            planeNum = 1;
+            planeNum = SINGLE_PLANE;
            break;
     }
    return planeNum;
diff --git a/media_softlet/agnostic/common/shared/mediacopy/media_blt_copy_next.h b/media_softlet/agnostic/common/shared/mediacopy/media_blt_copy_next.h
index 027cd57..20d43fc 100644
--- a/media_softlet/agnostic/common/shared/mediacopy/media_blt_copy_next.h
+++ b/media_softlet/agnostic/common/shared/mediacopy/media_blt_copy_next.h
@@ -94,8 +94,8 @@
     //!           [in] Pointer to input surface
     //! \param    outputSurface
     //!           [in] Pointer to output surface
-    //! \param    plane index
-    //!           [in] plan index, e.g Y plane index 0, UV plane index 1.
+    //! \param    planeIndex
+    //!           [in] Pointer to YUV(RGB) plane index
     //! \return   MOS_STATUS
     //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
     //!
@@ -119,27 +119,16 @@
     //!
     //! \brief    Get Block copy color depth.
     //! \details  get different format's color depth.
-    //! \param    surface 
-    //!           [in] input or output surface.
-    //! \return   MOS_STATUS
-    //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
+    //! \param    Gmm format and bits perf block
+    //!           [in] Gmm format, Bits per Block;
+    //! \return   color depth
+    //!           Return color depth
     //!
     uint32_t GetBlkCopyColorDepth(
         GMM_RESOURCE_FORMAT dstFormat,
-        uint32_t            BytesPerTexel);
+        uint32_t            BitsPerBlock);
 
     //!
-    //! \brief    Get Fast copy color depth.
-    //! \details  get different format's color depth.
-    //! \param    surface
-    //!           [in] input or output surface.
-    //! \return   MOS_STATUS
-    //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
-    //!
-    uint32_t GetFastCopyColorDepth(
-        GMM_RESOURCE_FORMAT dstFormat,
-        uint32_t            BytesPerTexel);
-    //!
     //! \brief    Get plane's byte per texel
     //! \details  Get plane's byte per texel
     //! \param    MOS_FORMAT format
@@ -320,7 +309,6 @@
         PBLT_STATE_PARAM pBltStateParam);
 
 public:
-    bool               m_blokCopyon       = false;
     PMOS_INTERFACE     m_osInterface      = nullptr;
     MhwInterfacesNext *m_mhwInterfaces    = nullptr;
     MhwCpInterface    *m_cpInterface      = nullptr;
diff --git a/media_softlet/agnostic/common/shared/mediacopy/media_copy.cpp b/media_softlet/agnostic/common/shared/mediacopy/media_copy.cpp
index 512e214..31c8db4 100644
--- a/media_softlet/agnostic/common/shared/mediacopy/media_copy.cpp
+++ b/media_softlet/agnostic/common/shared/mediacopy/media_copy.cpp
@@ -98,6 +98,8 @@
     }
     MediaUserSettingSharedPtr           userSettingPtr = nullptr;
 
+    m_surfaceDumper->GetSurfaceDumpLocation(m_dumpLocation_in, mcpy_in);
+    m_surfaceDumper->GetSurfaceDumpLocation(m_dumpLocation_out, mcpy_out);
     if (m_osInterface)
     {
         userSettingPtr = m_osInterface->pfnGetUserSettingInstance(m_osInterface);
@@ -124,7 +126,12 @@
 //! \return   MOS_STATUS
 //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
 //!
-MOS_STATUS MediaCopyBaseState::CapabilityCheck(MCPY_STATE_PARAMS &mcpySrc, MCPY_STATE_PARAMS &mcpyDst, MCPY_ENGINE_CAPS &caps, MCPY_METHOD preferMethod)
+MOS_STATUS MediaCopyBaseState::CapabilityCheck(
+    MOS_FORMAT         format,
+    MCPY_STATE_PARAMS &mcpySrc,
+    MCPY_STATE_PARAMS &mcpyDst,
+    MCPY_ENGINE_CAPS  &caps,
+    MCPY_METHOD        preferMethod)
 {
     // derivate class specific check. include HW engine avaliable check.
     MCPY_CHK_STATUS_RETURN(FeatureSupport(mcpySrc.OsRes, mcpyDst.OsRes, mcpySrc, mcpyDst, caps));
@@ -143,6 +150,11 @@
         mcpySrc.bAuxSuface)
     {
         caps.engineVebox = false;
+        // temp solution for FP16 enabling on new platform
+        if (format == Format_A16B16G16R16F || format == Format_A16R16G16B16F)
+        {
+            return MOS_STATUS_UNIMPLEMENTED;
+        }
     }
 
     // Eu cap check.
@@ -183,19 +195,19 @@
 //! \return   MOS_STATUS
 //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
 //!
-MOS_STATUS MediaCopyBaseState::CopyEnigneSelect(MCPY_METHOD preferMethod, MCPY_ENGINE& mcpyEngine, MCPY_ENGINE_CAPS& caps)
+MOS_STATUS MediaCopyBaseState::CopyEnigneSelect(MCPY_METHOD& preferMethod, MCPY_ENGINE& mcpyEngine, MCPY_ENGINE_CAPS& caps)
 {
     // driver should make sure there is at least one he can process copy even customer choice doesn't match caps.
     switch (preferMethod)
     {
         case MCPY_METHOD_PERFORMANCE:
-        case MCPY_METHOD_DEFAULT:
             mcpyEngine = caps.engineRender?MCPY_ENGINE_RENDER:(caps.engineBlt ? MCPY_ENGINE_BLT : MCPY_ENGINE_VEBOX);
             break;
         case MCPY_METHOD_BALANCE:
             mcpyEngine = caps.engineVebox?MCPY_ENGINE_VEBOX:(caps.engineBlt?MCPY_ENGINE_BLT:MCPY_ENGINE_RENDER);
             break;
         case MCPY_METHOD_POWERSAVING:
+        case MCPY_METHOD_DEFAULT:
             mcpyEngine = caps.engineBlt?MCPY_ENGINE_BLT:(caps.engineVebox?MCPY_ENGINE_VEBOX:MCPY_ENGINE_RENDER);
             break;
         default:
@@ -256,6 +268,14 @@
     case Format_L8:
     case Format_A8:
     case Format_Y16U:
+    case Format_A16B16G16R16F:
+    case Format_A16R16G16B16F:
+    case Format_A16B16G16R16:
+    case Format_A16R16G16B16:
+    case Format_IRW0:
+    case Format_IRW1:
+    case Format_IRW2:
+    case Format_IRW3:
         nBytes = pitch * height;
         break;
     default:
@@ -418,7 +438,9 @@
 
     MCPY_CHK_STATUS_RETURN(PreCheckCpCopy(mcpySrc, mcpyDst, preferMethod));
 
-    MCPY_CHK_STATUS_RETURN(CapabilityCheck(mcpySrc, mcpyDst, mcpyEngineCaps, preferMethod));
+    MCPY_CHK_STATUS_RETURN(CapabilityCheck(SrcResDetails.Format,
+        mcpySrc, mcpyDst,
+        mcpyEngineCaps, preferMethod));
 
     CopyEnigneSelect(preferMethod, mcpyEngine, mcpyEngineCaps);
 
@@ -438,12 +460,6 @@
     MOS_SURFACE sourceSurface = {};
     MOS_SURFACE targetSurface = {};
 
-    char  dumpLocation_in[MAX_PATH];
-    char  dumpLocation_out[MAX_PATH];
-
-    MOS_ZeroMemory(dumpLocation_in, MAX_PATH);
-    MOS_ZeroMemory(dumpLocation_out, MAX_PATH);
-
     targetSurface.Format = Format_Invalid;
     targetSurface.OsResource = *mcpyDst.OsRes;
 
@@ -459,17 +475,16 @@
 
     // Set the dump location like "dumpLocation before MCPY=path_to_dump_folder" in user feature configure file
     // Otherwise, the surface may not be dumped
-    if (m_surfaceDumper)
+    // Only dump linear surface
+    if (m_surfaceDumper && mcpySrc.TileMode == MOS_TILE_LINEAR)
     {
-        m_surfaceDumper->GetSurfaceDumpLocation(dumpLocation_in, mcpy_in);
-
-        if ((*dumpLocation_in == '\0') || (*dumpLocation_in == ' '))
+        if ((*m_dumpLocation_in == '\0') || (*m_dumpLocation_in == ' '))
         {
             MCPY_NORMALMESSAGE("Invalid dump location set, the surface will not be dumped");
         }
         else
         {
-            m_surfaceDumper->DumpSurfaceToFile(m_osInterface, &sourceSurface, dumpLocation_in, m_surfaceDumper->m_frameNum, true, false, nullptr);
+            m_surfaceDumper->DumpSurfaceToFile(m_osInterface, &sourceSurface, m_dumpLocation_in, m_surfaceDumper->m_frameNum, true, false, nullptr);
         }
     }
 #endif
@@ -481,16 +496,6 @@
             eStatus = MediaVeboxCopy(mcpySrc.OsRes, mcpyDst.OsRes);
             break;
         case MCPY_ENGINE_BLT:
-            if ((mcpySrc.TileMode != MOS_TILE_LINEAR) && (mcpySrc.CompressionMode != MOS_MMC_DISABLED))
-            {
-                MCPY_NORMALMESSAGE("mmc on, mcpySrc.TileMode= %d, mcpySrc.CompressionMode = %d", mcpySrc.TileMode, mcpySrc.CompressionMode);
-                eStatus = m_osInterface->pfnDecompResource(m_osInterface, mcpySrc.OsRes);
-                if (MOS_STATUS_SUCCESS != eStatus)
-                {
-                    MosUtilities::MosUnlockMutex(m_inUseGPUMutex);
-                    MCPY_CHK_STATUS_RETURN(eStatus);
-                }
-            }
             if ((mcpyDst.TileMode != MOS_TILE_LINEAR) && (mcpyDst.CompressionMode == MOS_MMC_RC))
             {
                 MCPY_NORMALMESSAGE("mmc on, mcpyDst.TileMode= %d, mcpyDst.CompressionMode = %d", mcpyDst.TileMode, mcpyDst.CompressionMode);
@@ -525,17 +530,16 @@
 
     // Set the dump location like "dumpLocation after MCPY=path_to_dump_folder" in user feature configure file
     // Otherwise, the surface may not be dumped
-    if (m_surfaceDumper)
+    // Only dump linear surface
+    if (m_surfaceDumper && mcpyDst.TileMode == MOS_TILE_LINEAR)
     {
-        m_surfaceDumper->GetSurfaceDumpLocation(dumpLocation_out, mcpy_out);
-
-        if ((*dumpLocation_out == '\0') || (*dumpLocation_out == ' '))
+        if ((*m_dumpLocation_out == '\0') || (*m_dumpLocation_out == ' '))
         {
             MCPY_NORMALMESSAGE("Invalid dump location set, the surface will not be dumped");
         }
         else
         {
-            m_surfaceDumper->DumpSurfaceToFile(m_osInterface, &targetSurface, dumpLocation_out, m_surfaceDumper->m_frameNum, true, false, nullptr);
+            m_surfaceDumper->DumpSurfaceToFile(m_osInterface, &targetSurface, m_dumpLocation_out, m_surfaceDumper->m_frameNum, true, false, nullptr);
         }
         m_surfaceDumper->m_frameNum++;
     }
diff --git a/media_softlet/agnostic/common/shared/mediacopy/media_copy.h b/media_softlet/agnostic/common/shared/mediacopy/media_copy.h
index 0722f00..e3567c4 100644
--- a/media_softlet/agnostic/common/shared/mediacopy/media_copy.h
+++ b/media_softlet/agnostic/common/shared/mediacopy/media_copy.h
@@ -101,6 +101,8 @@
     //!
     //! \brief    check copy capability.
     //! \details  to determine surface copy is supported or not.
+    //! \param    format
+    //!           [in] surface format
     //! \param    mcpySrc
     //!           [in] Pointer to source paramters
     //! \param    mcpyDst
@@ -110,7 +112,12 @@
     //! \return   MOS_STATUS
     //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
     //!
-    virtual MOS_STATUS CapabilityCheck(MCPY_STATE_PARAMS &mcpySrc, MCPY_STATE_PARAMS &mcpyDst, MCPY_ENGINE_CAPS &caps, MCPY_METHOD preferMethod);
+    virtual MOS_STATUS CapabilityCheck(
+        MOS_FORMAT         format,
+        MCPY_STATE_PARAMS &mcpySrc,
+        MCPY_STATE_PARAMS &mcpyDst,
+        MCPY_ENGINE_CAPS  &caps,
+        MCPY_METHOD        preferMethod);
 
     //!
     //! \brief    surface copy pre process.
@@ -242,7 +249,7 @@
     //! \return   MOS_STATUS
     //!           Return MOS_STATUS_SUCCESS if support, otherwise return unspoort.
     //!
-    virtual MOS_STATUS CopyEnigneSelect(MCPY_METHOD preferMethod, MCPY_ENGINE &mcpyEngine, MCPY_ENGINE_CAPS &caps);
+    virtual MOS_STATUS CopyEnigneSelect(MCPY_METHOD& preferMethod, MCPY_ENGINE &mcpyEngine, MCPY_ENGINE_CAPS &caps);
 
     //!
     //! \brief    use blt engie to do surface copy.
@@ -297,6 +304,8 @@
     int                  m_MCPYForceMode        = 0;
     bool                 m_enableVeCopySmallRes = false;
     bool                 m_bRegReport           = true;
+    char                 m_dumpLocation_in[MAX_PATH]  = {};
+    char                 m_dumpLocation_out[MAX_PATH] = {};
 #endif
 MEDIA_CLASS_DEFINE_END(MediaCopyBaseState)
 };
diff --git a/media_softlet/agnostic/common/shared/mediacopy/media_copy_common.h b/media_softlet/agnostic/common/shared/mediacopy/media_copy_common.h
index 001295c..723dc60 100644
--- a/media_softlet/agnostic/common/shared/mediacopy/media_copy_common.h
+++ b/media_softlet/agnostic/common/shared/mediacopy/media_copy_common.h
@@ -50,6 +50,17 @@
 #define RENDER_COPY                         0x701
 #define BLT_COPY                            0x702
 
+#define SINGLE_PLANE                        0x1
+#define TWO_PLANES                          0x2
+#define THREE_PLANES                        0x3
+
+typedef enum YUVANDRGB_PLANE_INDEX_ENUM
+{
+    MCPY_PLANE_Y  = 0,
+    MCPY_PLANE_U  = 1,
+    MCPY_PLANE_V  = 2,
+} YUVANDRGB_PLANE_INDEX;
+
 //!
 //! \brief  Enum for CCS read/write flag
 //!
diff --git a/media_softlet/agnostic/common/shared/mediacopy/media_render_copy_next.cpp b/media_softlet/agnostic/common/shared/mediacopy/media_render_copy_next.cpp
index 933199a..9cc123c 100644
--- a/media_softlet/agnostic/common/shared/mediacopy/media_render_copy_next.cpp
+++ b/media_softlet/agnostic/common/shared/mediacopy/media_render_copy_next.cpp
@@ -503,7 +503,7 @@
 
     pRenderData->SurfMemObjCtl.SourceSurfMemObjCtl =
          pRenderHal->pOsInterface->pfnCachePolicyGetMemoryObject(
-         MOS_HW_RESOURCE_USAGE_VP_INTERNAL_READ_WRITE_RENDER,
+         MOS_MP_RESOURCE_USAGE_SurfaceState_RCS,
          pRenderHal->pOsInterface->pfnGetGmmClientContext(pRenderHal->pOsInterface)).DwordValue;
 
     pRenderData->SurfMemObjCtl.TargetSurfMemObjCtl = pRenderData->SurfMemObjCtl.SourceSurfMemObjCtl;
diff --git a/media_softlet/agnostic/common/shared/mediacopy/media_vebox_copy_next.cpp b/media_softlet/agnostic/common/shared/mediacopy/media_vebox_copy_next.cpp
index 9266f6f..fc63ed6 100644
--- a/media_softlet/agnostic/common/shared/mediacopy/media_vebox_copy_next.cpp
+++ b/media_softlet/agnostic/common/shared/mediacopy/media_vebox_copy_next.cpp
@@ -121,11 +121,8 @@
     outputSurface.OsResource = *dst;
     GetResourceInfo(&outputSurface);
 
-    if (!IsFormatSupported(&inputSurface))
-    {
-        VEBOX_COPY_ASSERTMESSAGE("UnSupported Format.");
-        return MOS_STATUS_UNIMPLEMENTED;
-    }
+    // For RGB10/BGR10/Y210/Y410/A8, use other format instead. No need to check format again.
+    AdjustSurfaceFormat(inputSurface);
 
     MHW_VEBOX_GPUNODE_LIMIT     GpuNodeLimit;
     MOS_GPU_NODE                VeboxGpuNode;
@@ -239,7 +236,7 @@
     return eStatus;
 }
 
-bool VeboxCopyStateNext::IsFormatSupported(PMOS_RESOURCE surface)
+bool VeboxCopyStateNext::IsSurfaceSupported(PMOS_RESOURCE surface)
 {
     bool supported = false;
     MOS_SURFACE inputSurface;
@@ -254,7 +251,7 @@
     inputSurface.OsResource = *surface;
     GetResourceInfo(&inputSurface);
 
-    supported = IsFormatSupported(&inputSurface);
+    supported = IsVeCopySupportedFormat(inputSurface.Format);
 
     if (inputSurface.TileType == MOS_TILE_LINEAR &&
         (inputSurface.dwPitch % 64))
@@ -537,69 +534,54 @@
     return eStatus;
 }
 
-bool VeboxCopyStateNext::IsFormatSupported(PMOS_SURFACE surface)
+bool VeboxCopyStateNext::IsVeCopySupportedFormat(MOS_FORMAT format)
 {
-    bool    bRet = false;
+    if (format == Format_R10G10B10A2 ||
+        format == Format_B10G10R10A2 ||
+        format == Format_A8R8G8B8 ||
+        format == Format_A8B8G8R8 ||
+        format == Format_X8R8G8B8 ||
+        format == Format_X8B8G8R8 ||
+        IS_RGB64_FLOAT_FORMAT(format) ||
 
-    if (surface->Format == Format_R10G10B10A2 ||
-        surface->Format == Format_B10G10R10A2 ||
-        surface->Format == Format_Y410 ||
-        surface->Format == Format_Y210)
+        format == Format_AYUV ||
+        format == Format_Y410 ||
+        format == Format_Y416 ||
+        format == Format_Y210 ||
+        format == Format_Y216 ||
+        format == Format_YUY2 ||
+        format == Format_NV12 ||
+        format == Format_P010 ||
+        format == Format_P016 ||
+
+        format == Format_A8 ||
+        format == Format_Y8 ||
+        format == Format_L8 ||
+        format == Format_P8 ||
+        format == Format_Y16U)
     {
-        // Re-map RGB10/RGB10/Y410/Y210 as AYUV
-        surface->Format = Format_AYUV;
+        return true;
     }
-
-    if (surface->Format == Format_A8 ||
-        surface->Format == Format_Y8 ||
-        surface->Format == Format_L8 ||
-        surface->Format == Format_P8 ||
-        surface->Format == Format_STMM)
+    else
     {
-        surface->Format = Format_P8;
+        VEBOX_COPY_NORMALMESSAGE("Unsupported format '0x%08x' for VEBOX copy.", format);
+        return false;
     }
+}
 
-    if (surface->Format == Format_IMC3 ||
-        surface->Format == Format_444P ||
-        surface->Format == Format_422H ||
-        surface->Format == Format_422V ||
-        surface->Format == Format_411P ||
-        surface->Format == Format_411R ||
-        surface->Format == Format_444P ||
-        surface->Format == Format_RGBP ||
-        surface->Format == Format_BGRP ||
-        surface->Format == Format_400P ||
-        surface->Format == Format_420O ||
-        surface->Format == Format_Buffer)
+void VeboxCopyStateNext::AdjustSurfaceFormat(MOS_SURFACE &surface)
+{
+    if (surface.Format == Format_R10G10B10A2 ||
+        surface.Format == Format_B10G10R10A2 ||
+        surface.Format == Format_Y410        ||
+        surface.Format == Format_Y210)
     {
-        surface->Format   = Format_P8;
-        surface->dwHeight = surface->dwSize / surface->dwPitch;
+        // RGB10 not supported without IECP. Re-map RGB10/RGB10 as AYUV
+        // Y410/Y210 has HW issue. Remap to AYUV.
+        surface.Format = Format_AYUV;
     }
-
-    if (IS_RGB64_FLOAT_FORMAT(surface->Format))
+    else if (surface.Format == Format_A8)
     {
-        surface->Format = Format_Y416;
+        surface.Format = Format_P8;
     }
-
-    // Check if Sample Format is supported for decompression
-    if (surface->Format != Format_NV12        &&
-        surface->Format != Format_AYUV        &&
-        surface->Format != Format_Y416        &&
-        surface->Format != Format_P010        &&
-        surface->Format != Format_P016        &&
-        !IS_PA_FORMAT(surface->Format)        &&
-        surface->Format != Format_A8R8G8B8    &&
-        surface->Format != Format_A8B8G8R8    &&
-        surface->Format != Format_X8R8G8B8    &&
-        surface->Format != Format_X8B8G8R8    &&
-        surface->Format != Format_P8 &&
-        surface->Format != Format_Y16U)
-    {
-        VEBOX_COPY_NORMALMESSAGE("Unsupported Source Format '0x%08x' for VEBOX Decompression.", surface->Format);
-        return bRet;
-    }
-
-    bRet = true;
-
-    return bRet;
 }
\ No newline at end of file
diff --git a/media_softlet/agnostic/common/shared/mediacopy/media_vebox_copy_next.h b/media_softlet/agnostic/common/shared/mediacopy/media_vebox_copy_next.h
index be62741..521d646 100644
--- a/media_softlet/agnostic/common/shared/mediacopy/media_vebox_copy_next.h
+++ b/media_softlet/agnostic/common/shared/mediacopy/media_vebox_copy_next.h
@@ -89,12 +89,12 @@
         PMOS_RESOURCE dst);
 
     //!
-    //! Is Vebox Tile Convert/Decompression Format supported
+    //! Is ve copy supported surface
     //! \param    [in/out]     surface
     //!           Pointer to Output Surface parameters
     //! \return   true if supported, else false.
     //!
-    bool IsFormatSupported(PMOS_RESOURCE surface);
+    bool IsSurfaceSupported(PMOS_RESOURCE surface);
 
     //!
     //! \brief    Setup Vebox_Surface_State Command parameter
@@ -133,12 +133,14 @@
         PMOS_COMMAND_BUFFER              cmdBuffer);
 
     //!
-    //! Is Vebox Tile Convert/Decompression Format supported
-    //! \param    [in/out]     surface
-    //!           Pointer to Output Surface parameters
+    //! Is ve copy supported format
+    //! \param    [in/out] surface mos format
+    //!
     //! \return   true if supported, else false.
     //!
-    bool IsFormatSupported(PMOS_SURFACE surface);
+    virtual bool IsVeCopySupportedFormat(MOS_FORMAT format);
+    
+    virtual void AdjustSurfaceFormat(MOS_SURFACE &surface);
 
 protected:
     PMOS_INTERFACE      m_osInterface   = nullptr;
diff --git a/media_softlet/agnostic/common/shared/packet/media_render_cmd_packet.cpp b/media_softlet/agnostic/common/shared/packet/media_render_cmd_packet.cpp
index 4630a88..a995853 100644
--- a/media_softlet/agnostic/common/shared/packet/media_render_cmd_packet.cpp
+++ b/media_softlet/agnostic/common/shared/packet/media_render_cmd_packet.cpp
@@ -1090,15 +1090,31 @@
         gpgpuWalker.GroupHeight += gpgpuWalker.GroupStartingY;
     }
 
-    gpgpuWalker.ThreadWidth              = COMPUTE_WALKER_THREAD_SPACE_WIDTH;
-    gpgpuWalker.ThreadHeight             = COMPUTE_WALKER_THREAD_SPACE_HEIGHT;
-    gpgpuWalker.ThreadDepth              = COMPUTE_WALKER_THREAD_SPACE_DEPTH;
+    if (params.threadDepth && params.threadWidth && params.threadHeight)
+    {
+        gpgpuWalker.ThreadWidth  = params.threadWidth;
+        gpgpuWalker.ThreadHeight = params.threadHeight;
+        gpgpuWalker.ThreadDepth  = params.threadDepth;
+    }
+    else
+    {
+        gpgpuWalker.ThreadWidth  = COMPUTE_WALKER_THREAD_SPACE_WIDTH;
+        gpgpuWalker.ThreadHeight = COMPUTE_WALKER_THREAD_SPACE_HEIGHT;
+        gpgpuWalker.ThreadDepth  = COMPUTE_WALKER_THREAD_SPACE_DEPTH;
+    }
     gpgpuWalker.IndirectDataStartAddress = params.iCurbeOffset;
     // Indirect Data Length is a multiple of 64 bytes (size of L3 cacheline). Bits [5:0] are zero.
     gpgpuWalker.IndirectDataLength = MOS_ALIGN_CEIL(params.iCurbeLength, 1 << MHW_COMPUTE_INDIRECT_SHIFT);
     gpgpuWalker.BindingTableID     = params.iBindingTable;
     gpgpuWalker.ForcePreferredSLMZero = params.forcePreferredSLMZero;
 
+    gpgpuWalker.isEmitInlineParameter = params.isEmitInlineParameter;
+    gpgpuWalker.inlineDataLength      = params.inlineDataLength;
+    gpgpuWalker.inlineData            = params.inlineData;
+
+    gpgpuWalker.isGenerateLocalID = params.isGenerateLocalID;
+    gpgpuWalker.emitLocal         = params.emitLocal;
+    
     return MOS_STATUS_SUCCESS;
 }
 
diff --git a/media_softlet/agnostic/common/shared/packet/media_render_cmd_packet.h b/media_softlet/agnostic/common/shared/packet/media_render_cmd_packet.h
index a2e5903..e0194c4 100644
--- a/media_softlet/agnostic/common/shared/packet/media_render_cmd_packet.h
+++ b/media_softlet/agnostic/common/shared/packet/media_render_cmd_packet.h
@@ -80,6 +80,15 @@
         (MhwKernelParam).iKCID    = (_pKernelEntry)->iKCID;                         \
     } while(0)
 
+typedef struct _PIPECONTRL_PARAMS
+{
+    bool bUpdateNeeded;
+    bool bEnableDataPortFlush;
+    bool bUnTypedDataPortCacheFlush;
+    bool bFlushRenderTargetCache;
+    bool bInvalidateTextureCache;
+} PIPECONTRL_PARAMS, *PPIPECONTRL_PARAMS;
+
 typedef struct _KERNEL_WALKER_PARAMS
 {
     int32_t                             iBindingTable;
@@ -90,12 +99,25 @@
     int32_t                             iBlocksX;
     int32_t                             iBlocksY;
     RECT                                alignedRect;
+    PIPECONTRL_PARAMS                   pipeControlParams;
     bool                                isVerticalPattern;
     bool                                bSyncFlag;
     bool                                bFlushL1;
     bool                                isGroupStartInvolvedInGroupSize;    // true if group start need be involved in the group size.
     bool                                calculateBlockXYByAlignedRect;      // true if iBlocksX/iBlocksY is calculated by alignedRect in RenderCmdPacket instead of kernel object.
     bool                                forcePreferredSLMZero;              // true if preferredSLM need force to 0.
+
+    bool                                isEmitInlineParameter;
+    uint32_t                            inlineDataLength;
+    uint8_t*                            inlineData;
+
+    uint32_t                            threadWidth;
+    uint32_t                            threadHeight;
+    uint32_t                            threadDepth;
+
+    bool                                isGenerateLocalID;
+    MHW_EMIT_LOCAL_MODE                 emitLocal;
+    
 }KERNEL_WALKER_PARAMS, * PKERNEL_WALKER_PARAMS;
 
 typedef struct _KERNEL_PACKET_RENDER_DATA
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 03142af..af27af3 100644
--- a/media_softlet/agnostic/common/shared/profiler/media_perf_profiler.cpp
+++ b/media_softlet/agnostic/common/shared/profiler/media_perf_profiler.cpp
@@ -963,6 +963,9 @@
         case MOS_GPU_CONTEXT_BLT:
             node = PERF_GPU_NODE_BLT;
             break;
+        case MOS_GPU_CONTEXT_TEE:
+            node = PERF_GPU_NODE_TEE;
+            break;
         default:
             node = PERF_GPU_NODE_UNKNOW;
             break;
diff --git a/media_softlet/agnostic/common/shared/profiler/media_perf_profiler.h b/media_softlet/agnostic/common/shared/profiler/media_perf_profiler.h
index a7e7322..8b38201 100644
--- a/media_softlet/agnostic/common/shared/profiler/media_perf_profiler.h
+++ b/media_softlet/agnostic/common/shared/profiler/media_perf_profiler.h
@@ -57,6 +57,7 @@
     PERF_GPU_NODE_BLT    = 2,
     PERF_GPU_NODE_VE     = 3,
     PERF_GPU_NODE_VIDEO2 = 4,
+    PERF_GPU_NODE_TEE    = 6,
     PERF_GPU_NODE_UNKNOW = 0xFF
 }PerfGPUNode;
 
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 bb4e8c2..3af71ea 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
@@ -43,7 +43,7 @@
 }
 
 MOS_STATUS VphdrResourceManager::AssignRenderResource(VP_EXECUTE_CAPS &caps, std::vector<VP_SURFACE *> &inputSurfaces, VP_SURFACE *outputSurface, RESOURCE_ASSIGNMENT_HINT resHint,
-    VP_SURFACE_SETTING &surfSetting, SwFilterPipe &executedFilters, MOS_INTERFACE osInterface, VphalFeatureReport &reporting, bool deferredDestroyed)
+    VP_SURFACE_SETTING &surfSetting, SwFilterPipe &executedFilters, MOS_INTERFACE &osInterface, VphalFeatureReport &reporting, bool deferredDestroyed)
 {
     VP_FUNC_CALL();
 
diff --git a/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_hdr_resource_manager.h b/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_hdr_resource_manager.h
index e494dbb..b55974a 100644
--- a/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_hdr_resource_manager.h
+++ b/media_softlet/agnostic/common/vp/hal/bufferMgr/vp_hdr_resource_manager.h
@@ -41,7 +41,7 @@
 public:
     VphdrResourceManager(VpAllocator &allocator);
     ~VphdrResourceManager();
-    MOS_STATUS AssignRenderResource(VP_EXECUTE_CAPS &caps, std::vector<VP_SURFACE *> &inputSurfaces, VP_SURFACE *outputSurface, RESOURCE_ASSIGNMENT_HINT resHint, VP_SURFACE_SETTING &surfSetting, SwFilterPipe &executedFilters, MOS_INTERFACE osInterface, VphalFeatureReport &reporting, bool deferredDestroyed);
+    MOS_STATUS AssignRenderResource(VP_EXECUTE_CAPS &caps, std::vector<VP_SURFACE *> &inputSurfaces, VP_SURFACE *outputSurface, RESOURCE_ASSIGNMENT_HINT resHint, VP_SURFACE_SETTING &surfSetting, SwFilterPipe &executedFilters, MOS_INTERFACE &osInterface, VphalFeatureReport &reporting, bool deferredDestroyed);
 
 private:
     MOS_STATUS FreeHdrRenderResource();
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 b2fe12f..d0f5e0e 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
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2018-2023, Intel Corporation
+* Copyright (c) 2018-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -802,6 +802,13 @@
         params.rcSrc = scaling->GetSwFilterParams().output.rcSrc;
         params.rcDst = scaling->GetSwFilterParams().output.rcDst;
         params.rcMaxSrc = scaling->GetSwFilterParams().output.rcMaxSrc;
+
+        if (scaling->GetSwFilterParams().interlacedScalingType == ISCALING_INTERLEAVED_TO_FIELD)
+        {
+            params.height = scaling->GetSwFilterParams().output.dwHeight / 2;
+            params.rcDst.bottom = params.rcDst.bottom / 2;
+            params.rcMaxSrc.bottom = params.rcMaxSrc.bottom / 2;
+        }
     }
     else
     {
@@ -1214,15 +1221,37 @@
     return MOS_STATUS_SUCCESS;
 }
 
+VPHAL_CSPACE GetDemosaicOutputColorSpace(VPHAL_CSPACE colorSpace)
+{
+    return IS_COLOR_SPACE_BT2020(colorSpace) ? CSpace_BT2020_RGB : CSpace_sRGB;
+}
+
+MOS_FORMAT GetDemosaicOutputFormat(VPHAL_CSPACE colorSpace)
+{
+    return IS_COLOR_SPACE_BT2020(colorSpace) ? Format_R10G10B10A2 : Format_A8B8G8R8;
+}
+
 MOS_STATUS GetVeboxOutputParams(VP_EXECUTE_CAPS &executeCaps, MOS_FORMAT inputFormat, MOS_TILE_TYPE inputTileType, MOS_FORMAT outputFormat,
-                                MOS_FORMAT &veboxOutputFormat, MOS_TILE_TYPE &veboxOutputTileType)
+                                MOS_FORMAT &veboxOutputFormat, MOS_TILE_TYPE &veboxOutputTileType, VPHAL_CSPACE colorSpaceOutput)
 {
     VP_FUNC_CALL();
 
     // Vebox Chroma Co-Sited downsampleing is part of VEO. It only affects format of vebox output surface, but not
     // affect sfc input format, that's why different logic between GetSfcInputFormat and GetVeboxOutputParams.
     // Check DI first and downsampling to NV12 if possible to save bandwidth no matter IECP enabled or not.
-    if (executeCaps.bDI || executeCaps.bDiProcess2ndField)
+    if (executeCaps.b3DlutOutput)
+    {
+        if (IS_RGB64_FLOAT_FORMAT(outputFormat))  // SFC output FP16, YUV->ABGR16
+        {
+            veboxOutputFormat = Format_A16B16G16R16;
+        }
+        else
+        {
+            veboxOutputFormat = IS_COLOR_SPACE_BT2020(colorSpaceOutput) ? Format_R10G10B10A2 : Format_A8B8G8R8;
+        }
+        veboxOutputTileType = inputTileType;
+    }
+    else if (executeCaps.bDI || executeCaps.bDiProcess2ndField)
     {
         // NV12 will be used if target output is not YUV2 to save bandwidth.
         if (outputFormat == Format_YUY2)
@@ -1248,6 +1277,11 @@
         veboxOutputFormat = Format_AYUV;
         veboxOutputTileType = inputTileType;
     }
+    else if (executeCaps.bDemosaicInUse)
+    {
+        veboxOutputFormat = GetDemosaicOutputFormat(colorSpaceOutput);
+        veboxOutputTileType = inputTileType;
+    }
     else
     {
         veboxOutputFormat = inputFormat;
@@ -1257,7 +1291,8 @@
     return MOS_STATUS_SUCCESS;
 }
 
-MOS_FORMAT GetSfcInputFormat(VP_EXECUTE_CAPS &executeCaps, MOS_FORMAT inputFormat, VPHAL_CSPACE colorSpaceOutput)
+
+MOS_FORMAT GetSfcInputFormat(VP_EXECUTE_CAPS &executeCaps, MOS_FORMAT inputFormat, VPHAL_CSPACE colorSpaceOutput, MOS_FORMAT outputFormat)
 {
     VP_FUNC_CALL();
 
@@ -1267,7 +1302,14 @@
     // Then Check IECP, since IECP is done after DI, and the vebox downsampling not affect the vebox input.
     if (executeCaps.b3DlutOutput)
     {
-        return IS_COLOR_SPACE_BT2020(colorSpaceOutput) ? Format_R10G10B10A2 : Format_A8B8G8R8;
+        if (IS_RGB64_FLOAT_FORMAT(outputFormat))    // SFC output FP16, YUV->ABGR16
+        {
+            return Format_A16B16G16R16;
+        }
+        else
+        {
+            return IS_COLOR_SPACE_BT2020(colorSpaceOutput) ? Format_R10G10B10A2 : Format_A8B8G8R8;
+        }
     }
     else if (executeCaps.bIECP && executeCaps.bCGC && executeCaps.bBt2020ToRGB)
     {
@@ -1288,6 +1330,10 @@
         // set to YUY2 here.
         return Format_YUY2;
     }
+    else if (executeCaps.bDemosaicInUse)
+    {
+        return GetDemosaicOutputFormat(colorSpaceOutput);
+    }
 
     return inputFormat;
 }
@@ -1316,7 +1362,7 @@
     MOS_TILE_TYPE   veboxOutputTileType                 = inputSurface->osSurface->TileType;
 
     VP_PUBLIC_CHK_STATUS_RETURN(GetVeboxOutputParams(caps, inputSurface->osSurface->Format, inputSurface->osSurface->TileType,
-                                            outputSurface->osSurface->Format, veboxOutputFormat, veboxOutputTileType));
+                                            outputSurface->osSurface->Format, veboxOutputFormat, veboxOutputTileType, outputSurface->ColorSpace));
 
     allocated = false;
 
@@ -1326,17 +1372,8 @@
         enableVeboxOutputSurf = m_vpUserFeatureControl->IsVeboxOutputSurfEnabled();
     }
 
-    if (enableVeboxOutputSurf || IS_VP_VEBOX_DN_ONLY(caps))
-    {
-        bSurfCompressible   = inputSurface->osSurface->bCompressible;
-        surfCompressionMode = inputSurface->osSurface->CompressionMode;
-    }
-    else
-    {
-        bSurfCompressible   = true;
-        surfCompressionMode = MOS_MMC_MC;
-
-    }
+    bSurfCompressible   = inputSurface->osSurface->bCompressible;
+    surfCompressionMode = inputSurface->osSurface->CompressionMode;
 
     if (m_currentFrameIds.pastFrameAvailable && m_currentFrameIds.futureFrameAvailable)
     {
diff --git a/media_softlet/agnostic/common/vp/hal/feature_manager/hw_filter.h b/media_softlet/agnostic/common/vp/hal/feature_manager/hw_filter.h
index e4093a2..a412373 100644
--- a/media_softlet/agnostic/common/vp/hal/feature_manager/hw_filter.h
+++ b/media_softlet/agnostic/common/vp/hal/feature_manager/hw_filter.h
@@ -49,6 +49,7 @@
 #include "vp_hdr_render_filter.h"
 #include "vp_di_filter.h"
 #include "vp_fc_filter.h"
+#include "vp_l0_fc_filter.h"
 
 namespace vp
 {
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 fd985c0..58c6c41 100644
--- a/media_softlet/agnostic/common/vp/hal/feature_manager/policy.cpp
+++ b/media_softlet/agnostic/common/vp/hal/feature_manager/policy.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2019-2023, Intel Corporation
+* Copyright (c) 2019-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -188,49 +188,7 @@
     VP_PUBLIC_CHK_NULL_RETURN(p);
     m_VeboxSfcFeatureHandlers.insert(std::make_pair(FeatureTypeAlphaOnSfc, p));
 
-    p = MOS_New(PolicyDiHandler, m_hwCaps);
-    VP_PUBLIC_CHK_NULL_RETURN(p);
-    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeDiFmdOnRender, p));
-
-    p = MOS_New(PolicyFcHandler, m_hwCaps);
-    VP_PUBLIC_CHK_NULL_RETURN(p);
-    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeFcOnRender, p));
-
-    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
-    VP_PUBLIC_CHK_NULL_RETURN(p);
-    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeLumakeyOnRender, p));
-
-    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
-    VP_PUBLIC_CHK_NULL_RETURN(p);
-    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeBlendingOnRender, p));
-
-    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
-    VP_PUBLIC_CHK_NULL_RETURN(p);
-    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeColorFillOnRender, p));
-
-    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
-    VP_PUBLIC_CHK_NULL_RETURN(p);
-    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeAlphaOnRender, p));
-
-    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
-    VP_PUBLIC_CHK_NULL_RETURN(p);
-    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeCscOnRender, p));
-
-    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
-    VP_PUBLIC_CHK_NULL_RETURN(p);
-    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeScalingOnRender, p));
-
-    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
-    VP_PUBLIC_CHK_NULL_RETURN(p);
-    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeRotMirOnRender, p));
-
-    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
-    VP_PUBLIC_CHK_NULL_RETURN(p);
-    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeDiOnRender, p));
-
-    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
-    VP_PUBLIC_CHK_NULL_RETURN(p);
-    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeProcampOnRender, p));
+    VP_PUBLIC_CHK_STATUS_RETURN(RegisterFcFeatures());
 
     p = MOS_New(PolicyVeboxCgcHandler, m_hwCaps);
     VP_PUBLIC_CHK_NULL_RETURN(p);
@@ -275,6 +233,51 @@
     m_featurePool.clear();
 }
 
+MOS_STATUS Policy::RegisterFcFeatures()
+{
+    PolicyFeatureHandler *p = MOS_New(PolicyFcHandler, m_hwCaps);
+    VP_PUBLIC_CHK_NULL_RETURN(p);
+    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeFcOnRender, p));
+
+    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
+    VP_PUBLIC_CHK_NULL_RETURN(p);
+    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeLumakeyOnRender, p));
+
+    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
+    VP_PUBLIC_CHK_NULL_RETURN(p);
+    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeBlendingOnRender, p));
+
+    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
+    VP_PUBLIC_CHK_NULL_RETURN(p);
+    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeColorFillOnRender, p));
+
+    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
+    VP_PUBLIC_CHK_NULL_RETURN(p);
+    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeAlphaOnRender, p));
+
+    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
+    VP_PUBLIC_CHK_NULL_RETURN(p);
+    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeCscOnRender, p));
+
+    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
+    VP_PUBLIC_CHK_NULL_RETURN(p);
+    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeScalingOnRender, p));
+
+    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
+    VP_PUBLIC_CHK_NULL_RETURN(p);
+    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeRotMirOnRender, p));
+
+    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
+    VP_PUBLIC_CHK_NULL_RETURN(p);
+    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeDiOnRender, p));
+
+    p = MOS_New(PolicyFcFeatureHandler, m_hwCaps);
+    VP_PUBLIC_CHK_NULL_RETURN(p);
+    m_RenderFeatureHandlers.insert(std::make_pair(FeatureTypeProcampOnRender, p));
+
+    return MOS_STATUS_SUCCESS;
+}
+
 /*                                    Enable SwFilterPipe                                           */
 
 MOS_STATUS Policy::CreateHwFilter(SwFilterPipe &subSwFilterPipe, HwFilter *&pFilter)
@@ -452,12 +455,12 @@
             }
             else
             {
-                VP_PUBLIC_CHK_STATUS_RETURN(GetCSCExecutionCaps(feature));
+                VP_PUBLIC_CHK_STATUS_RETURN(GetCSCExecutionCaps(feature, false));
             }
         }
         else
         {
-            VP_PUBLIC_CHK_STATUS_RETURN(GetCSCExecutionCaps(feature));
+            VP_PUBLIC_CHK_STATUS_RETURN(GetCSCExecutionCaps(feature, false));
         }
         break;
     case FeatureTypeScaling:
@@ -695,8 +698,16 @@
 
     MOS_FORMAT   hdrFormat  = Format_Any;
     VPHAL_CSPACE hdrCSpace  = CSpace_Any;
-    hdrCSpace               = IS_COLOR_SPACE_BT2020(cscParams->output.colorSpace) ? CSpace_BT2020_RGB : CSpace_sRGB;
-    hdrFormat               = IS_COLOR_SPACE_BT2020(cscParams->output.colorSpace) ? Format_R10G10B10A2 : Format_A8R8G8B8;
+    if (cscParams->isFullRgbG10P709 && IS_RGB64_FLOAT_FORMAT(cscParams->formatOutput))
+    {
+        hdrCSpace = CSpace_BT2020_RGB;
+        hdrFormat = Format_A16B16G16R16;
+    }
+    else
+    {
+        hdrCSpace = IS_COLOR_SPACE_BT2020(cscParams->output.colorSpace) ? CSpace_BT2020_RGB : CSpace_sRGB;
+        hdrFormat = IS_COLOR_SPACE_BT2020(cscParams->output.colorSpace) ? Format_R10G10B10A2 : Format_A8R8G8B8;
+    }
     VP_PUBLIC_CHK_STATUS_RETURN(Update3DLutoutputColorAndFormat(cscParams, hdrParams, hdrFormat, hdrCSpace));
 
     if (m_hwCaps.m_sfcHwEntry[hdrFormat].inputSupported &&
@@ -738,7 +749,7 @@
     auto userFeatureControl = m_vpInterface.GetHwInterface()->m_userFeatureControl;
     bool disableSfc         = userFeatureControl->IsSfcDisabled();
 
-    VP_PUBLIC_CHK_STATUS_RETURN(GetCSCExecutionCaps(feature));
+    VP_PUBLIC_CHK_STATUS_RETURN(GetCSCExecutionCaps(feature, false));
 
     VP_EngineEntry *cscEngine = &csc->GetFilterEngineCaps();
     VP_PUBLIC_CHK_NULL_RETURN(cscEngine);
@@ -834,6 +845,11 @@
     return MOS_STATUS_SUCCESS;
 }
 
+bool Policy::IsDemosaicValidOutputFormat(MOS_FORMAT format)
+{
+    return (format == Format_R10G10B10A2 || format == Format_A8R8G8B8);
+}
+
 bool IsBeCscNeededForAlphaFill(MOS_FORMAT formatInput, MOS_FORMAT formatOutput, PVPHAL_ALPHA_PARAMS compAlpha)
 {
     if (nullptr == compAlpha)
@@ -952,7 +968,7 @@
     }
 }
 
-MOS_STATUS Policy::GetCSCExecutionCaps(SwFilter* feature)
+MOS_STATUS Policy::GetCSCExecutionCaps(SwFilter* feature, bool isCamPipeWithBayerInput)
 {
     VP_FUNC_CALL();
     VP_PUBLIC_CHK_NULL_RETURN(feature);
@@ -1094,7 +1110,8 @@
     {
         if (!cscParams->pIEFParams                                                            &&
             m_hwCaps.m_veboxHwEntry[cscParams->formatInput].inputSupported                    &&
-            m_hwCaps.m_veboxHwEntry[cscParams->formatOutput].outputSupported                  &&
+            (m_hwCaps.m_veboxHwEntry[cscParams->formatOutput].outputSupported ||
+            (isCamPipeWithBayerInput && IsDemosaicValidOutputFormat(cscParams->formatOutput))) &&
             m_hwCaps.m_veboxHwEntry[cscParams->formatInput].iecp                              &&
             m_hwCaps.m_veboxHwEntry[cscParams->formatInput].backEndCscSupported               &&
             isAlphaSettingSupportedByVebox)
@@ -1730,24 +1747,12 @@
         return MOS_STATUS_SUCCESS;
     }
 
-    if (m_vpInterface.GetResourceManager()->IsRefValid() &&
-        diParams.diParams && diParams.diParams->bEnableFMD)
-    {
-        diParams.bFmdExtraVariance = true;
-    }
-
     if (m_vpInterface.GetResourceManager()->IsRefValid()    &&
         m_vpInterface.GetResourceManager()->IsSameSamples())
     {
         diEngine.bypassVeboxFeatures    = 1;
         diEngine.diProcess2ndField      = 1;
     }
-    else if (diParams.bFmdExtraVariance && diParams.bFmdKernelEnable)
-    {
-        diEngine.bEnabled     = 1;
-        diEngine.RenderNeeded = 1;
-        diEngine.isolated     = 1;
-    }
     else
     {
         if (diParams.diParams->DIMode == DI_MODE_BOB)
@@ -1975,8 +1980,23 @@
     }
 
     pHDREngine->is1K1DLutSurfaceInUse = m_hwCaps.m_rules.is1K1DLutSurfaceInUse;
-
-    if (Is3DLutKernelSupported())
+    if (hdrParams->external3DLutParams && userFeatureControl->IsExternal3DLutSupport())
+    {
+        hdrParams->stage        = HDR_STAGE_VEBOX_EXTERNAL_3DLUT;
+        pHDREngine->bEnabled    = 1;
+        pHDREngine->VeboxNeeded = 1;
+        if (hdrParams->formatOutput == Format_A8B8G8R8 || hdrParams->formatOutput == Format_A8R8G8B8)
+        {
+            pHDREngine->VeboxARGBOut = 1;
+        }
+        else if (hdrParams->formatOutput == Format_B10G10R10A2 || hdrParams->formatOutput == Format_R10G10B10A2)
+        {
+            pHDREngine->VeboxARGB10bitOutput = 1;
+        }
+        VP_PUBLIC_NORMALMESSAGE("3DLUT table setup by API, use HDR_STAGE_VEBOX_EXTERNAL_3DLUT.");
+        return MOS_STATUS_SUCCESS;
+    }
+    else if (Is3DLutKernelSupported())
     {
         if (hdrParams->uiMaxContentLevelLum != m_savedMaxCLL || hdrParams->uiMaxDisplayLum != m_savedMaxDLL ||
             hdrParams->hdrMode != m_savedHdrMode)
@@ -2302,6 +2322,8 @@
         caps.bDiProcess2ndField = engineCaps.diProcess2ndField;
         caps.bTemperalInputInuse = engineCaps.bTemperalInputInuse;
         caps.b1K1DLutInUse       = engineCaps.is1K1DLutSurfaceInUse;
+        caps.bDemosaicInUse      = engineCaps.isBayerInputInUse;
+        
         if (engineCaps.fcOnlyFeatureExists)
         {
             // For vebox/sfc+render case, use 2nd workload (render) to do csc for better performance
@@ -3639,15 +3661,7 @@
             break;
         case FeatureTypeDi:
             caps.bDI          = 1;
-            if (feature->GetFilterEngineCaps().isolated)
-            {
-                caps.bDIFmdKernel = 1;
-                feature->SetFeatureType(FeatureType(FEATURE_TYPE_EXECUTE(DiFmd, Render)));
-            }
-            else
-            {
-                feature->SetFeatureType(FeatureType(FEATURE_TYPE_EXECUTE(Di, Render)));
-            }
+            feature->SetFeatureType(FeatureType(FEATURE_TYPE_EXECUTE(Di, Render)));
             break;
         case FeatureTypeLumakey:
             caps.bComposite = 1;
@@ -3884,7 +3898,7 @@
     return status;
 }
 
-MOS_STATUS GetVeboxOutputParams(VP_EXECUTE_CAPS &executeCaps, MOS_FORMAT inputFormat, MOS_TILE_TYPE inputTileType, MOS_FORMAT outputFormat, MOS_FORMAT &veboxOutputFormat, MOS_TILE_TYPE &veboxOutputTileType);
+MOS_STATUS GetVeboxOutputParams(VP_EXECUTE_CAPS &executeCaps, MOS_FORMAT inputFormat, MOS_TILE_TYPE inputTileType, MOS_FORMAT outputFormat, MOS_FORMAT &veboxOutputFormat, MOS_TILE_TYPE &veboxOutputTileType, VPHAL_CSPACE colorSpaceOutput);
 
 MOS_STATUS Policy::GetCscParamsOnCaps(PVP_SURFACE surfInput, PVP_SURFACE surfOutput, VP_EXECUTE_CAPS &caps, FeatureParamCsc &cscParams)
 {
@@ -3910,7 +3924,7 @@
         MOS_FORMAT    veboxOutputFormat   = surfInput->osSurface->Format;
         MOS_TILE_TYPE veboxOutputTileType = surfInput->osSurface->TileType;
 
-        GetVeboxOutputParams(caps, surfInput->osSurface->Format, surfInput->osSurface->TileType, surfOutput->osSurface->Format, veboxOutputFormat, veboxOutputTileType);
+        GetVeboxOutputParams(caps, surfInput->osSurface->Format, surfInput->osSurface->TileType, surfOutput->osSurface->Format, veboxOutputFormat, veboxOutputTileType, surfOutput->ColorSpace);
         cscParams.input.colorSpace = surfInput->ColorSpace;
         cscParams.output.colorSpace = surfInput->ColorSpace;
 
diff --git a/media_softlet/agnostic/common/vp/hal/feature_manager/policy.h b/media_softlet/agnostic/common/vp/hal/feature_manager/policy.h
index fe72126..d57ca25 100644
--- a/media_softlet/agnostic/common/vp/hal/feature_manager/policy.h
+++ b/media_softlet/agnostic/common/vp/hal/feature_manager/policy.h
@@ -78,6 +78,7 @@
 protected:
     virtual MOS_STATUS RegisterFeatures();
     virtual void UnregisterFeatures();
+    virtual MOS_STATUS RegisterFcFeatures();
     virtual MOS_STATUS GetExecutionCapsForSingleFeature(FeatureType featureType, SwFilterSubPipe& swFilterPipe, VP_EngineEntry& engineCapsCombined);
     virtual MOS_STATUS UpdateExeCaps(SwFilter* feature, VP_EXECUTE_CAPS& caps, EngineType Type);
     virtual MOS_STATUS UpdateCGCMode(SwFilter* feature, VP_EXECUTE_CAPS& caps, EngineType Type);
@@ -94,7 +95,7 @@
     MOS_STATUS GetCSCExecutionCapsHdr(SwFilter *hdr, SwFilter *csc);
     MOS_STATUS GetCSCExecutionCapsDi(SwFilter* feature);
     MOS_STATUS GetCSCExecutionCapsBT2020ToRGB(SwFilter *cgc, SwFilter *csc);
-    MOS_STATUS GetCSCExecutionCaps(SwFilter* feature);
+    MOS_STATUS GetCSCExecutionCaps(SwFilter* feature, bool isCamPipeWithBayerInput);
     bool IsSfcSupported(MOS_FORMAT format);
     MOS_STATUS GetScalingExecutionCaps(SwFilter* feature, bool isDIEnabled);
     MOS_STATUS GetScalingExecutionCaps(SwFilter *feature, bool isHdrEnabled, bool isDIEnabled);
@@ -126,7 +127,7 @@
     MOS_STATUS UpdateFeatureTypeWithEngine(std::vector<int> &layerIndexes, SwFilterPipe& featurePipe, VP_EXECUTE_CAPS& caps,
                                         bool isolatedFeatureSelected, bool outputPipeNeeded);
     MOS_STATUS UpdateFeatureTypeWithEngineSingleLayer(SwFilterSubPipe *featureSubPipe, VP_EXECUTE_CAPS& caps, bool isolatedFeatureSelected);
-    MOS_STATUS LayerSelectForProcess(std::vector<int> &layerIndexes, SwFilterPipe& featurePipe, bool isSingleSubPipe, uint32_t pipeIndex, VP_EXECUTE_CAPS& caps);
+    virtual MOS_STATUS LayerSelectForProcess(std::vector<int> &layerIndexes, SwFilterPipe& featurePipe, bool isSingleSubPipe, uint32_t pipeIndex, VP_EXECUTE_CAPS& caps);
 
     MOS_STATUS UpdateFeaturePipe(SwFilterPipe &featurePipe, uint32_t pipeIndex, SwFilterPipe &executedFilters, uint32_t executePipeIndex,
                                 bool isInputPipe, VP_EXECUTE_CAPS& caps);
@@ -139,6 +140,7 @@
     MOS_STATUS SetupExecuteFilter(SwFilterPipe& featurePipe, std::vector<int> &layerIndexes, VP_EXECUTE_CAPS& caps, HW_FILTER_PARAMS& params);
     MOS_STATUS SetupFilterResource(SwFilterPipe& featurePipe, std::vector<int> &layerIndexes, VP_EXECUTE_CAPS& caps, HW_FILTER_PARAMS& params);
 
+    bool IsDemosaicValidOutputFormat(MOS_FORMAT format);
     bool IsAlphaSettingSupportedBySfc(MOS_FORMAT formatInput, MOS_FORMAT formatOutput, PVPHAL_ALPHA_PARAMS compAlpha);
     bool IsAlphaSettingSupportedByVebox(MOS_FORMAT formatInput, MOS_FORMAT formatOutput, PVPHAL_ALPHA_PARAMS compAlpha);
     bool IsIsolateFeatureOutputPipeNeeded(SwFilterSubPipe *featureSubPipe, SwFilter *swFilter);
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 220a17d..6a3c593 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
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2019-2021, Intel Corporation
+* Copyright (c) 2019-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -174,6 +174,7 @@
     m_Params.output.chromaSiting    = surfOutput->ChromaSiting;
     m_Params.input.tileMode         = surfInput->TileModeGMM;
     m_Params.output.tileMode        = surfOutput->TileModeGMM;
+    m_Params.isFullRgbG10P709       = surfOutput->pGamutParams ? surfOutput->pGamutParams->GammaValue == GAMMA_1P0 : 0 && surfOutput->ColorSpace == CSpace_sRGB && IS_RGB64_FLOAT_FORMAT(surfOutput->Format);
     // Alpha should be handled in input pipe to avoid alpha data lost from image.
     m_Params.pAlphaParams           = params.pCompAlpha;
     // formatForCUS will be set on demand in Policy::GetCSCExecutionCapsBT2020ToRGB.
@@ -187,7 +188,7 @@
 namespace vp
 {
 MOS_STATUS GetVeboxOutputParams(VP_EXECUTE_CAPS &executeCaps, MOS_FORMAT inputFormat, MOS_TILE_TYPE inputTileType, MOS_FORMAT outputFormat,
-                                MOS_FORMAT &veboxOutputFormat, MOS_TILE_TYPE &veboxOutputTileType);
+                                MOS_FORMAT &veboxOutputFormat, MOS_TILE_TYPE &veboxOutputTileType, VPHAL_CSPACE colorSpaceOutput);
 }
 
 MOS_STATUS SwFilterCsc::Configure(PVP_SURFACE surfInput, PVP_SURFACE surfOutput, VP_EXECUTE_CAPS caps)
@@ -205,7 +206,7 @@
         MOS_TILE_TYPE   veboxOutputTileType = surfInput->osSurface->TileType;
 
         GetVeboxOutputParams(caps, surfInput->osSurface->Format, surfInput->osSurface->TileType,
-                            surfOutput->osSurface->Format, veboxOutputFormat, veboxOutputTileType);
+                            surfOutput->osSurface->Format, veboxOutputFormat, veboxOutputTileType, surfOutput->ColorSpace);
         m_Params.input.colorSpace = surfInput->ColorSpace;
         m_Params.output.colorSpace = surfInput->ColorSpace;
 
@@ -1297,6 +1298,18 @@
     uint32_t     dwUpdateMask = 0;
     bool                        bSupported       = false;
     VPHAL_HDR_LUT_MODE          CurrentLUTMode      = VPHAL_HDR_LUT_MODE_NONE;
+    VP_PUBLIC_CHK_NULL_RETURN(m_vpInterface.GetHwInterface());
+    VP_PUBLIC_CHK_NULL_RETURN(m_vpInterface.GetHwInterface()->m_userFeatureControl);
+    VP_PUBLIC_CHK_NULL_RETURN(m_vpInterface.GetHwInterface()->m_vpPlatformInterface);
+    VP_PUBLIC_CHK_NULL_RETURN(m_vpInterface.GetHwInterface()->m_reporting);
+
+    auto userFeatureControl = m_vpInterface.GetHwInterface()->m_userFeatureControl;
+    auto vpPlatformInterface = m_vpInterface.GetHwInterface()->m_vpPlatformInterface;
+    VpFeatureReport *vpFeatureReport  = dynamic_cast<VpFeatureReport *>(m_vpInterface.GetHwInterface()->m_reporting);
+#if (_DEBUG || _RELEASE_INTERNAL)
+    m_Params.isL0KernelEnabled               = (vpPlatformInterface->IsAdvanceNativeKernelSupported() && userFeatureControl->EnableL03DLut());
+    vpFeatureReport->GetFeatures().isL03DLut = m_Params.isL0KernelEnabled;
+#endif
 
     VP_PUBLIC_CHK_NULL_RETURN(surfInput);
     VP_PUBLIC_CHK_NULL_RETURN(surfOutput);
@@ -1307,6 +1320,10 @@
     m_Params.formatOutput = surfOutput->Format;
     m_Params.widthInput   = surfInput->dwWidth;
     m_Params.heightInput  = surfInput->dwHeight;
+    if (surfInput->p3DLutParams)
+    {
+        m_Params.external3DLutParams = surfInput->p3DLutParams;
+    }
 
     // For H2S, it is possible that there is no HDR params for render target.
     m_Params.uiMaxContentLevelLum = 4000;
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 320474d..4241b12 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
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2019-2022, Intel Corporation
+* Copyright (c) 2019-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -84,7 +84,6 @@
     FeatureTypeDi                   = 0x500,
     FeatureTypeDiOnVebox            = FeatureTypeDi | FEATURE_TYPE_ENGINE_BITS_VEBOX,
     FeatureTypeDiOnRender           = FeatureTypeDi | FEATURE_TYPE_ENGINE_BITS_RENDER,
-    FeatureTypeDiFmdOnRender        = FeatureTypeDi | FEATURE_TYPE_ENGINE_BITS_RENDER | FEATURE_TYPE_ENGINE_BITS_SUB_STEP,
     FeatureTypeSte                  = 0x600,
     FeatureTypeSteOnVebox           = FeatureTypeSte | FEATURE_TYPE_ENGINE_BITS_VEBOX,
     FeatureTypeVeboxUpdate          = 0x700,
@@ -406,6 +405,7 @@
     PVPHAL_ALPHA_PARAMS pAlphaParams    = nullptr;
     MOS_FORMAT          formatforCUS    = Format_None;            //!< Only valid when formatforCUS != Format_None for Chromaupsampling. To be cleared in SwFilterCsc::Configure
     FeatureParamCsc     *next           = nullptr;                //!< pointe to new/next generated CSC params
+    bool                isFullRgbG10P709 = false;                  //!< whether output colorspace is DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709
 };
 
 class SwFilterCsc : public SwFilter
@@ -651,7 +651,6 @@
     bool                    bHDContent           = false;
     PVPHAL_DI_PARAMS        diParams             = nullptr;
     bool                    bFmdExtraVariance    = false;     //!< Check if extra FMD variances need to be calculated
-    bool                    bFmdKernelEnable     = false;     //!< FMD kernel path enabled
     bool                    bQueryVarianceEnable = false;     //!< Query variance enabled
     uint32_t                heightInput          = 0;
     RECT                    rcSrc                = {0, 0, 0, 0};
@@ -676,10 +675,10 @@
     }
     virtual MOS_STATUS AddFeatureGraphRTLog()
     {
-        MT_LOG5(MT_VP_FEATURE_GRAPH_SWFILTERDEINTERLACE, MT_NORMAL, MT_VP_FEATURE_GRAPH_FILTER_SAMPLETYPEINPUT, m_Params.sampleTypeInput, MT_VP_FEATURE_GRAPH_FILTER_FMDKERNELENABLE, m_Params.bFmdKernelEnable,
-                MT_VP_FEATURE_GRAPH_FILTER_SINGLEFIELD, m_Params.diParams ? m_Params.diParams->bSingleField : -1, MT_VP_FEATURE_GRAPH_FILTER_DIMODE, m_Params.diParams ? m_Params.diParams->DIMode : -1,
-                MT_VP_FEATURE_GRAPH_FILTER_FEATURETYPE, GetFeatureType());
-        VP_PUBLIC_NORMALMESSAGE("Feature Graph: SwFilterDeinterlace: sampleTypeInput %d, bFmdKernelEnable %d, bSingleField %d, DIMode %d, FeatureType %d", m_Params.sampleTypeInput, m_Params.bFmdKernelEnable,
+        MT_LOG4(MT_VP_FEATURE_GRAPH_SWFILTERDEINTERLACE, MT_NORMAL, MT_VP_FEATURE_GRAPH_FILTER_SAMPLETYPEINPUT, m_Params.sampleTypeInput,
+                 MT_VP_FEATURE_GRAPH_FILTER_SINGLEFIELD, m_Params.diParams ? m_Params.diParams->bSingleField : -1, MT_VP_FEATURE_GRAPH_FILTER_DIMODE, m_Params.diParams ? m_Params.diParams->DIMode : -1,
+                 MT_VP_FEATURE_GRAPH_FILTER_FEATURETYPE, GetFeatureType());
+        VP_PUBLIC_NORMALMESSAGE("Feature Graph: SwFilterDeinterlace: sampleTypeInput %d, bSingleField %d, DIMode %d, FeatureType %d", m_Params.sampleTypeInput,
                                 m_Params.diParams ? m_Params.diParams->bSingleField : -1, m_Params.diParams ? m_Params.diParams->DIMode : -1, GetFeatureType());
         return MOS_STATUS_SUCCESS;
     }
@@ -817,6 +816,7 @@
     HDR_STAGE_3DLUT_KERNEL,
     HDR_STAGE_VEBOX_3DLUT_UPDATE,
     HDR_STAGE_VEBOX_3DLUT_NO_UPDATE,
+    HDR_STAGE_VEBOX_EXTERNAL_3DLUT,
 };
 
 //!
@@ -880,9 +880,11 @@
     uint32_t                uiSplitFramePortions                 = 1;                     //!< Split Frame flag
     bool                    bForceSplitFrame                     = false;
     bool                    bNeed3DSampler                       = false;                 //!< indicate whether 3D should neede by force considering AVS removal etc.
+    bool                    isL0KernelEnabled                    = false;
 
     HDR_PARAMS srcHDRParams    = {};
     HDR_PARAMS targetHDRParams = {};
+    PVPHAL_3DLUT_PARAMS external3DLutParams = nullptr;
 };
 
 class SwFilterHdr : public SwFilter
diff --git a/media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter_handle.cpp b/media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter_handle.cpp
index e69e6be..8934e64 100644
--- a/media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter_handle.cpp
+++ b/media_softlet/agnostic/common/vp/hal/feature_manager/sw_filter_handle.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2020-2021, Intel Corporation
+* Copyright (c) 2020-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -691,6 +691,7 @@
     // if  target surf is invalid, return false;
     PVPHAL_SURFACE pSrc            = params.pSrc[0];
     PVPHAL_SURFACE pRenderTarget   = params.pTarget[0];
+    auto           userFeatureControl = m_vpInterface.GetHwInterface()->m_userFeatureControl;
     if (!pSrc || !pRenderTarget)
     {
         return false;
@@ -702,6 +703,11 @@
     bool bFP16Format         = false;
     // Not all FP16 input / output need HDR processing, e.g, FP16 by pass, FP16 csc etc.
     bool bFP16HdrProcessing  = false;
+    bool isExternal3DLutEnabled     = false;
+    if (pSrc->p3DLutParams && userFeatureControl->IsExternal3DLutSupport())
+    {
+        isExternal3DLutEnabled = true;
+    }
     // Need to use HDR to process BT601/BT709->BT2020
     if (IS_COLOR_SPACE_BT2020(pRenderTarget->ColorSpace) &&
         !IS_COLOR_SPACE_BT2020(pSrc->ColorSpace))
@@ -722,7 +728,7 @@
 
     bFP16Format = bFP16Format || (pRenderTarget->Format == Format_A16B16G16R16F) || (pRenderTarget->Format == Format_A16R16G16B16F);
 
-    if (bFP16Format)
+    if (bFP16Format && !pSrc->p3DLutParams)
     {
         // Check if input/output gamma is same(TBD)
         // Check if input/output color space is same
@@ -747,7 +753,7 @@
 
     // Temorary solution for menu/FBI not show up : route all S2S uage to HDR kernel path, need to consider RenderBlockedFromCp
 
-    return (bBt2020Output || bToneMapping || bMultiLayerBt2020 || bFP16HdrProcessing);
+    return (bBt2020Output || bToneMapping || bMultiLayerBt2020 || bFP16HdrProcessing || isExternal3DLutEnabled);
 }
 
 SwFilter *SwFilterHdrHandler::CreateSwFilter()
diff --git a/media_softlet/agnostic/common/vp/hal/feature_manager/vp_kernelset.cpp b/media_softlet/agnostic/common/vp/hal/feature_manager/vp_kernelset.cpp
index a7ee76a..371162e 100644
--- a/media_softlet/agnostic/common/vp/hal/feature_manager/vp_kernelset.cpp
+++ b/media_softlet/agnostic/common/vp/hal/feature_manager/vp_kernelset.cpp
@@ -30,6 +30,8 @@
 #include "vp_render_vebox_hdr_3dlut_kernel.h"
 #include "vp_render_vebox_hvs_kernel.h"
 #include "vp_render_hdr_kernel.h"
+#include "vp_render_l0_fc_kernel.h"
+#include "vp_render_vebox_hdr_3dlut_l0_kernel.h"
 
 using namespace vp;
 
@@ -138,6 +140,11 @@
         }
         VP_RENDER_CHK_NULL_RETURN(kernel);
         break;
+    case kernelHdr3DLutCalcL0:
+        VP_RENDER_NORMALMESSAGE("HDR 3dlut kernel use l0 fillLutTable_3dlut kernel");
+        kernel = (VpRenderKernelObj *)MOS_New(VpRenderHdr3DLutL0Kernel, m_hwInterface, m_allocator);
+        VP_RENDER_CHK_NULL_RETURN(kernel);
+        break;
     case kernelHVSCalc:
         kernel = (VpRenderKernelObj *)MOS_New(VpRenderHVSKernel, m_hwInterface, kernelId, kernelIndex, m_allocator);
         VP_RENDER_CHK_NULL_RETURN(kernel);
@@ -146,6 +153,10 @@
         kernel = (VpRenderKernelObj *)MOS_New(VpRenderHdrKernel, m_hwInterface, m_allocator);
         VP_RENDER_CHK_NULL_RETURN(kernel);
         break;
+    case kernelFcDScale444:
+        kernel = (VpRenderKernelObj *)MOS_New(VpRenderL0FcKernel, m_hwInterface, kernelId, kernelIndex, m_allocator);
+        VP_RENDER_CHK_NULL_RETURN(kernel);
+        break;
     default:
         VP_RENDER_ASSERTMESSAGE("No supported kernel, return");
         return MOS_STATUS_UNIMPLEMENTED;
diff --git a/media_softlet/agnostic/common/vp/hal/features/kernel_args/igvp3dlut_args.h b/media_softlet/agnostic/common/vp/hal/features/kernel_args/igvp3dlut_args.h
new file mode 100644
index 0000000..b50e0fb
--- /dev/null
+++ b/media_softlet/agnostic/common/vp/hal/features/kernel_args/igvp3dlut_args.h
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2024, Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * 'Software'), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+////////////////////////////////////////////////////////////////////////////////
+// !!! WARNING - AUTO GENERATED FILE. DO NOT EDIT DIRECTLY. !!!
+// Generated by KernelBinToSource.exe tool
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef __IGVP3DLUT_ENUM_H__
+#define __IGVP3DLUT_ENUM_H__
+
+enum ARGS_3DLUT_FILLLUTTABLE
+{
+    LUT_FILLLUTTABLE_IOLUTINDEX,
+    LUT_FILLLUTTABLE_ICOEFINDEX,
+    LUT_FILLLUTTABLE_LUTSIZE,
+    LUT_FILLLUTTABLE_MULSIZE,
+    LUT_FILLLUTTABLE_PRIVATE_BASE_STATELESS,
+    LUT_FILLLUTTABLE_GLOBAL_ID_OFFSET,
+    LUT_FILLLUTTABLE_LOCAL_SIZE,
+    LUT_FILLLUTTABLE_MAX
+};
+
+#endif // __IGVP3DLUT_ENUM_H__
diff --git a/media_softlet/agnostic/common/vp/hal/features/kernel_args/igvpfc_scale_args.h b/media_softlet/agnostic/common/vp/hal/features/kernel_args/igvpfc_scale_args.h
new file mode 100644
index 0000000..b09db07
--- /dev/null
+++ b/media_softlet/agnostic/common/vp/hal/features/kernel_args/igvpfc_scale_args.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2024, Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the
+ * 'Software'), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+////////////////////////////////////////////////////////////////////////////////
+// !!! WARNING - AUTO GENERATED FILE. DO NOT EDIT DIRECTLY. !!!
+// Generated by KernelBinToSource.exe tool
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef __IGVPFC_SCALE_ENUM_H__
+#define __IGVPFC_SCALE_ENUM_H__
+
+enum ARGS_FC_SCALE_PA_444D
+{
+    FC_SCALE_PA_444D_INPUT,
+    FC_SCALE_PA_444D_OUTPUT,
+    FC_SCALE_PA_444D_SHIFT,
+    FC_SCALE_PA_444D_INPUTIMAGESMPL,
+    FC_SCALE_PA_444D_OFFSET,
+    FC_SCALE_PA_444D_BITNUM,
+    FC_SCALE_PA_444D_ENQUEUED_LOCAL_SIZE,
+    FC_SCALE_PA_444D_INPUT_IMAGE_HEIGHT,
+    FC_SCALE_PA_444D_OUTPUT_IMAGE_HEIGHT,
+    FC_SCALE_PA_444D_INPUT_IMAGE_WIDTH,
+    FC_SCALE_PA_444D_OUTPUT_IMAGE_WIDTH,
+    FC_SCALE_PA_444D_INPUTIMAGESMPL_SAMPLER_SNAP_WA,
+    FC_SCALE_PA_444D_GLOBAL_ID_OFFSET,
+    FC_SCALE_PA_444D_LOCAL_SIZE,
+    FC_SCALE_PA_444D_MAX
+};
+
+#endif // __IGVPFC_SCALE_ENUM_H__
diff --git a/media_softlet/agnostic/common/vp/hal/features/kernel_args/media_srcs.cmake b/media_softlet/agnostic/common/vp/hal/features/kernel_args/media_srcs.cmake
new file mode 100644
index 0000000..91f6555
--- /dev/null
+++ b/media_softlet/agnostic/common/vp/hal/features/kernel_args/media_srcs.cmake
@@ -0,0 +1,46 @@
+# Copyright (c) 2019-2024, Intel Corporation
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+# OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+
+set(TMP_SOURCES_
+
+)
+
+set(TMP_HEADERS_
+    ${CMAKE_CURRENT_LIST_DIR}/igvpfc_scale_args.h
+    ${CMAKE_CURRENT_LIST_DIR}/igvp3dlut_args.h
+)
+
+set(SOFTLET_VP_SOURCES_
+    ${SOFTLET_VP_SOURCES_}
+    ${TMP_SOURCES_}
+)
+
+set(SOFTLET_VP_HEADERS_
+    ${SOFTLET_VP_HEADERS_}
+    ${TMP_HEADERS_}
+)
+
+source_group( VpHalNext\\Shared\\KernelArgs FILES ${TMP_SOURCES_} ${TMP_HEADERS_})
+set(TMP_SOURCES_ "")
+set(TMP_HEADERS_ "")
+set (SOFTLET_VP_PRIVATE_INCLUDE_DIRS_
+    ${SOFTLET_VP_PRIVATE_INCLUDE_DIRS_}
+    ${CMAKE_CURRENT_LIST_DIR}
+)
\ No newline at end of file
diff --git a/media_softlet/agnostic/common/vp/hal/features/media_srcs.cmake b/media_softlet/agnostic/common/vp/hal/features/media_srcs.cmake
index ddc05db..6ae8f4e 100644
--- a/media_softlet/agnostic/common/vp/hal/features/media_srcs.cmake
+++ b/media_softlet/agnostic/common/vp/hal/features/media_srcs.cmake
@@ -1,4 +1,4 @@
-# Copyright (c) 2019-2022, Intel Corporation
+# Copyright (c) 2019-2024, Intel Corporation
 #
 # Permission is hereby granted, free of charge, to any person obtaining a
 # copy of this software and associated documentation files (the "Software"),
@@ -18,6 +18,8 @@
 # ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 # OTHER DEALINGS IN THE SOFTWARE.
 
+media_include_subdirectory(kernel_args)
+
 set(TMP_SOURCES_
     ${CMAKE_CURRENT_LIST_DIR}/vp_csc_filter.cpp
     ${CMAKE_CURRENT_LIST_DIR}/vp_filter.cpp
@@ -32,6 +34,7 @@
     ${CMAKE_CURRENT_LIST_DIR}/vp_di_filter.cpp
     ${CMAKE_CURRENT_LIST_DIR}/vp_fc_filter.cpp
     ${CMAKE_CURRENT_LIST_DIR}/vp_cgc_filter.cpp
+    ${CMAKE_CURRENT_LIST_DIR}/vp_l0_fc_filter.cpp
 )
 
 set(TMP_HEADERS_
@@ -48,6 +51,7 @@
     ${CMAKE_CURRENT_LIST_DIR}/vp_di_filter.h
     ${CMAKE_CURRENT_LIST_DIR}/vp_fc_filter.h
     ${CMAKE_CURRENT_LIST_DIR}/vp_cgc_filter.h
+    ${CMAKE_CURRENT_LIST_DIR}/vp_l0_fc_filter.h
 )
 
 set(SOFTLET_VP_SOURCES_
diff --git a/media_softlet/agnostic/common/vp/hal/features/vp_csc_filter.cpp b/media_softlet/agnostic/common/vp/hal/features/vp_csc_filter.cpp
index f922daa..69fc7f9 100644
--- a/media_softlet/agnostic/common/vp/hal/features/vp_csc_filter.cpp
+++ b/media_softlet/agnostic/common/vp/hal/features/vp_csc_filter.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2018-2022, Intel Corporation
+* Copyright (c) 2018-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -81,7 +81,8 @@
 #define VP_VEBOX_CHROMA_DOWNSAMPLING_422_TYPE2_VERT_OFFSET           0
 #define VP_VEBOX_CHROMA_DOWNSAMPLING_422_TYPE3_VERT_OFFSET           0
 
-MOS_FORMAT GetSfcInputFormat(VP_EXECUTE_CAPS &executeCaps, MOS_FORMAT inputFormat, VPHAL_CSPACE colorSpaceOutput);
+MOS_FORMAT GetSfcInputFormat(VP_EXECUTE_CAPS &executeCaps, MOS_FORMAT inputFormat, VPHAL_CSPACE colorSpaceOutput, MOS_FORMAT outputFormat);
+VPHAL_CSPACE GetDemosaicOutputColorSpace(VPHAL_CSPACE colorSpace);
 bool IsBeCscNeededForAlphaFill(MOS_FORMAT formatInput, MOS_FORMAT formatOutput, PVPHAL_ALPHA_PARAMS compAlpha);
 
 VpCscFilter::VpCscFilter(PVP_MHWINTERFACE vpMhwInterface) :
@@ -161,13 +162,20 @@
     return MOS_STATUS_SUCCESS;
 }
 
-VPHAL_CSPACE GetSfcInputColorSpace(VP_EXECUTE_CAPS &executeCaps, VPHAL_CSPACE inputColorSpace, VPHAL_CSPACE colorSpaceOutput)
+VPHAL_CSPACE GetSfcInputColorSpace(VP_EXECUTE_CAPS &executeCaps, VPHAL_CSPACE inputColorSpace, VPHAL_CSPACE colorSpaceOutput, MOS_FORMAT outputFormat)
 {
     VP_FUNC_CALL();
 
     if (executeCaps.b3DlutOutput)
     {
-        return IS_COLOR_SPACE_BT2020(colorSpaceOutput) ? CSpace_BT2020_RGB : CSpace_sRGB;
+        if (IS_RGB64_FLOAT_FORMAT(outputFormat)) // SFC output FP16, BT2020->BT709
+        {
+            return CSpace_BT2020_RGB;
+        }
+        else
+        {
+            return IS_COLOR_SPACE_BT2020(colorSpaceOutput) ? CSpace_BT2020_RGB : CSpace_sRGB;
+        }
     }
 
     // return sRGB as colorspace as Vebox will do Bt202 to sRGB Gamut switch
@@ -175,6 +183,11 @@
     {
         return CSpace_sRGB;
     }
+
+    if (executeCaps.bDemosaicInUse)
+    {
+        return GetDemosaicOutputColorSpace(colorSpaceOutput);
+    }
     return inputColorSpace;
 }
 
@@ -251,19 +264,21 @@
     // IsDitheringNeeded should be called before input format being updated by GetSfcInputFormat
     m_sfcCSCParams->isDitheringNeeded = IsDitheringNeeded(m_cscParams.formatInput, m_cscParams.formatOutput);
 
-    m_sfcCSCParams->inputColorSpace = GetSfcInputColorSpace(m_executeCaps, m_cscParams.input.colorSpace, m_cscParams.output.colorSpace);
+    m_sfcCSCParams->inputColorSpace = GetSfcInputColorSpace(m_executeCaps, m_cscParams.input.colorSpace, m_cscParams.output.colorSpace, m_cscParams.formatOutput);
 
-    m_cscParams.formatInput         = GetSfcInputFormat(m_executeCaps, m_cscParams.formatInput, m_cscParams.output.colorSpace);
+    m_cscParams.formatInput         = GetSfcInputFormat(m_executeCaps, m_cscParams.formatInput, m_cscParams.output.colorSpace, m_cscParams.formatOutput);
     m_sfcCSCParams->inputFormat     = m_cscParams.formatInput;
     m_sfcCSCParams->outputFormat    = m_cscParams.formatOutput;
+    m_sfcCSCParams->isFullRgbG10P709 = m_cscParams.isFullRgbG10P709;
+    m_sfcCSCParams->isDemosaicNeeded = m_executeCaps.bDemosaicInUse;
 
     // No need to check m_cscParams.pAlphaParams as CalculateVeboxEngineParams does, as alpha is done by scaling filter on SFC.
-    if (m_sfcCSCParams->inputColorSpace != m_cscParams.output.colorSpace)
+    if (m_sfcCSCParams->inputColorSpace != m_cscParams.output.colorSpace && !(IS_RGB64_FLOAT_FORMAT(m_sfcCSCParams->outputFormat) && m_sfcCSCParams->isFullRgbG10P709))
     {
         m_sfcCSCParams->bCSCEnabled = true;
     }
 
-    if (IS_RGB_CSPACE(m_sfcCSCParams->inputColorSpace))
+    if (IS_RGB_CSPACE(m_sfcCSCParams->inputColorSpace) || IS_COLOR_SPACE_BT2020_RGB(m_sfcCSCParams->inputColorSpace))
     {
         m_sfcCSCParams->isInputColorSpaceRGB = true;
     }
diff --git a/media_softlet/agnostic/common/vp/hal/features/vp_di_filter.cpp b/media_softlet/agnostic/common/vp/hal/features/vp_di_filter.cpp
index 8ae7078..7b5e2ff 100644
--- a/media_softlet/agnostic/common/vp/hal/features/vp_di_filter.cpp
+++ b/media_softlet/agnostic/common/vp/hal/features/vp_di_filter.cpp
@@ -61,11 +61,6 @@
         MOS_FreeMemAndSetNull(m_pVeboxDiParams);
     }
 
-    if (m_pRenderDiFmdParams)
-    {
-        MOS_FreeMemAndSetNull(m_pRenderDiFmdParams);
-    }
-
     return MOS_STATUS_SUCCESS;
 }
 
@@ -114,26 +109,6 @@
             m_pVeboxDiParams->bSCDEnabled       = m_diParams.diParams->bSCDEnable;
         }
     }
-    else if (m_executeCaps.bRender)
-    {
-        // create a filter Param buffer
-        if (!m_pRenderDiFmdParams)
-        {
-            m_pRenderDiFmdParams = (PRENDER_DI_FMD_PARAMS)MOS_AllocAndZeroMemory(sizeof(RENDER_DI_FMD_PARAMS));
-
-            if (m_pRenderDiFmdParams == nullptr)
-            {
-                VP_PUBLIC_ASSERTMESSAGE("Render FMD Pamas buffer allocate failed, return nullpointer");
-                return MOS_STATUS_NO_SPACE;
-            }
-        }
-        else
-        {
-            MOS_ZeroMemory(m_pRenderDiFmdParams, sizeof(RENDER_DI_FMD_PARAMS));
-        }
-
-        m_pRenderDiFmdParams->bEnableDiFmd                    = true;
-    }
     else
     {
         VP_PUBLIC_ASSERTMESSAGE("Wrong engine caps! Vebox should be used for DI");
@@ -220,41 +195,21 @@
 {
     VP_FUNC_CALL();
 
-    if (!m_diFilter.GetExecuteCaps().bDIFmdKernel)
+    VEBOX_DI_PARAMS *params = m_diFilter.GetVeboxParams();
+    if (nullptr == params)
     {
-        VEBOX_DI_PARAMS *params = m_diFilter.GetVeboxParams();
-        if (nullptr == params)
-        {
-            VP_PUBLIC_ASSERTMESSAGE("Failed to get vebox di params");
-            return false;
-        }
-
-        VpVeboxCmdPacketBase *packet = dynamic_cast<VpVeboxCmdPacketBase *>(pPacket);
-        if (packet)
-        {
-            return MOS_SUCCEEDED(packet->SetDiParams(params));
-        }
-
-        VP_PUBLIC_ASSERTMESSAGE("Invalid packet for vebox di");
+        VP_PUBLIC_ASSERTMESSAGE("Failed to get vebox di params");
         return false;
     }
-    else
+
+    VpVeboxCmdPacketBase *packet = dynamic_cast<VpVeboxCmdPacketBase *>(pPacket);
+    if (packet)
     {
-        VpRenderCmdPacket *pRenderPacket = dynamic_cast<VpRenderCmdPacket *>(pPacket);
-        if (nullptr == pRenderPacket)
-        {
-            return false;
-        }
-
-        RENDER_DI_FMD_PARAMS *pParams = m_diFilter.GetRenderParams();
-
-        if (nullptr == pParams)
-        {
-            return false;
-        }
-
-        return MOS_SUCCEEDED(pRenderPacket->SetDiFmdParams(pParams));
+        return MOS_SUCCEEDED(packet->SetDiParams(params));
     }
+
+    VP_PUBLIC_ASSERTMESSAGE("Invalid packet for vebox di");
+    return false;
 }
 
 MOS_STATUS VpDiParameter::Initialize(HW_FILTER_DI_PARAM &params)
@@ -299,14 +254,7 @@
             return nullptr;
         }
 
-        if (vpExecuteCaps.bRender)
-        {
-            swFilter = dynamic_cast<SwFilterDeinterlace *>(swFilterPipe.GetSwFilter(true, 0, FeatureTypeDiFmdOnRender));
-        }
-        else
-        {
-            swFilter = dynamic_cast<SwFilterDeinterlace *>(swFilterPipe.GetSwFilter(true, 0, FeatureTypeDiOnVebox));
-        }
+        swFilter = dynamic_cast<SwFilterDeinterlace *>(swFilterPipe.GetSwFilter(true, 0, FeatureTypeDiOnVebox));
 
         if (nullptr == swFilter)
         {
@@ -344,44 +292,4 @@
     {
         return nullptr;
     }
-}
-
-MOS_STATUS PolicyDiHandler::UpdateFeaturePipe(VP_EXECUTE_CAPS caps, SwFilter &feature, SwFilterPipe &featurePipe, SwFilterPipe &executePipe, bool isInputPipe, int index)
-{
-    VP_FUNC_CALL();
-
-    SwFilterDeinterlace *featureDi = dynamic_cast<SwFilterDeinterlace *>(&feature);
-    VP_PUBLIC_CHK_NULL_RETURN(featureDi);
-
-    if (featureDi->GetSwFilterParams().bFmdExtraVariance && !featureDi->GetSwFilterParams().bFmdKernelEnable)
-    {
-        SwFilterDeinterlace *filter2ndPass = featureDi;
-        SwFilterDeinterlace *filter1ndPass = (SwFilterDeinterlace *)feature.Clone();
-
-        VP_PUBLIC_CHK_NULL_RETURN(filter1ndPass);
-        VP_PUBLIC_CHK_NULL_RETURN(filter2ndPass);
-
-        filter1ndPass->GetFilterEngineCaps() = filter2ndPass->GetFilterEngineCaps();
-        filter1ndPass->SetFeatureType(filter2ndPass->GetFeatureType());
-
-        FeatureParamDeinterlace &params2ndPass = filter2ndPass->GetSwFilterParams();
-        FeatureParamDeinterlace &params1stPass = filter1ndPass->GetSwFilterParams();
-        params2ndPass.bFmdKernelEnable         = true;
-
-        // Clear engine caps for filter in 2nd pass.
-        filter2ndPass->SetFeatureType(FeatureTypeDi);
-        filter2ndPass->SetRenderTargetType(RenderTargetTypeParameter);
-        filter2ndPass->GetFilterEngineCaps().value = 0;
-        filter2ndPass->GetFilterEngineCaps().bEnabled     = 1;
-        filter2ndPass->GetFilterEngineCaps().RenderNeeded = 1;
-        filter2ndPass->GetFilterEngineCaps().isolated     = 1;
-
-        executePipe.AddSwFilterUnordered(filter1ndPass, isInputPipe, index);
-    }
-    else
-    {
-        return PolicyFeatureHandler::UpdateFeaturePipe(caps, feature, featurePipe, executePipe, isInputPipe, index);
-    }
-
-    return MOS_STATUS_SUCCESS;
 }
\ No newline at end of file
diff --git a/media_softlet/agnostic/common/vp/hal/features/vp_di_filter.h b/media_softlet/agnostic/common/vp/hal/features/vp_di_filter.h
index dde4ea8..6844106 100644
--- a/media_softlet/agnostic/common/vp/hal/features/vp_di_filter.h
+++ b/media_softlet/agnostic/common/vp/hal/features/vp_di_filter.h
@@ -61,15 +61,9 @@
         return m_pVeboxDiParams;
     }
 
-    PRENDER_DI_FMD_PARAMS GetRenderParams()
-    {
-        return m_pRenderDiFmdParams;
-    }
-
 protected:
     FeatureParamDeinterlace     m_diParams = {};
     PVEBOX_DI_PARAMS            m_pVeboxDiParams = nullptr;
-    PRENDER_DI_FMD_PARAMS       m_pRenderDiFmdParams = nullptr;
 
 MEDIA_CLASS_DEFINE_END(vp__VpDiFilter)
 };
@@ -119,11 +113,10 @@
     virtual ~PolicyDiHandler();
     virtual bool IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps);
     virtual HwFilterParameter *CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe &swFilterPipe, PVP_MHWINTERFACE pHwInterface);
-    virtual MOS_STATUS         UpdateFeaturePipe(VP_EXECUTE_CAPS caps, SwFilter &feature, SwFilterPipe &featurePipe, SwFilterPipe &executePipe, bool isInputPipe, int index);
 
     static VpPacketParameter* CreatePacketParam(HW_FILTER_PARAM& param)
     {
-        if (param.type != FeatureTypeDiOnVebox && param.type != FeatureTypeDiFmdOnRender)
+        if (param.type != FeatureTypeDiOnVebox)
         {
             VP_PUBLIC_ASSERTMESSAGE("Invalid parameter for Deinterlace!");
             return nullptr;
diff --git a/media_softlet/agnostic/common/vp/hal/features/vp_filter.h b/media_softlet/agnostic/common/vp/hal/features/vp_filter.h
index 4ee9b54..4d82132 100644
--- a/media_softlet/agnostic/common/vp/hal/features/vp_filter.h
+++ b/media_softlet/agnostic/common/vp/hal/features/vp_filter.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2018-2022, Intel Corporation
+* Copyright (c) 2018-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -161,6 +161,7 @@
     uint32_t                        interlacedScalingType;
     VPHAL_SAMPLE_TYPE               srcSampleType;
     VPHAL_SAMPLE_TYPE               dstSampleType;
+    bool                            isDemosaicNeeded;                           // 0: demosaic is not needed; 1: demosaic is needed
 };
 
 struct _SFC_CSC_PARAMS
@@ -178,6 +179,8 @@
     uint32_t                        sfcSrcChromaSiting;                          // SFC Source Chroma Siting location
     uint32_t                        chromaDownSamplingVerticalCoef;              // Chroma DownSampling Vertical Coeff
     uint32_t                        chromaDownSamplingHorizontalCoef;            // Chroma DownSampling Horizontal Coeff
+    bool                            isFullRgbG10P709;                            // Whether output colorspace is DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709
+    bool                            isDemosaicNeeded;                            // 0: demosaic is not needed; 1: demosaic is needed       
 };
 
 struct _SFC_ROT_MIR_PARAMS
@@ -304,6 +307,8 @@
     MOS_FORMAT                      dstFormat;
     HDR_STAGE                       stage;
     uint32_t                        lutSize;
+    bool                            isFp16Enable;
+    PVPHAL_3DLUT_PARAMS             external3DLutParams;
 };
 
 using SFC_SCALING_PARAMS    = _SFC_SCALING_PARAMS;
@@ -354,6 +359,8 @@
     VpKernelID                      kernelId;
     uint32_t                        threadWidth;
     uint32_t                        threadHeight;
+    uint32_t                        localWidth;
+    uint32_t                        localHeight;
     KERNEL_ARGS                     kernelArgs;
     void                            Init();
 };
@@ -445,18 +452,6 @@
     uint32_t                                          uThreadHeight;
 };
 
-struct _RENDER_DI_FMD_PARAMS
-{
-    bool                  bEnableDiFmd;
-    uint32_t              uKernelID;
-    uint32_t              dwVeboxPerBlockStatisticsHeight;
-    uint32_t              dwVeboxPerBlockStatisticsWidth;
-    VpKernelID            kernelId;
-};
-
-using RENDER_DI_FMD_PARAMS  = _RENDER_DI_FMD_PARAMS;
-using PRENDER_DI_FMD_PARAMS = RENDER_DI_FMD_PARAMS *;
-
 struct _RENDER_FC_PARAMS
 {
     VpKernelID              kernelId;
diff --git a/media_softlet/agnostic/common/vp/hal/features/vp_hdr_filter.cpp b/media_softlet/agnostic/common/vp/hal/features/vp_hdr_filter.cpp
index 641b85b..69a7b30 100644
--- a/media_softlet/agnostic/common/vp/hal/features/vp_hdr_filter.cpp
+++ b/media_softlet/agnostic/common/vp/hal/features/vp_hdr_filter.cpp
@@ -28,6 +28,7 @@
 #include "hw_filter.h"
 #include "sw_filter_pipe.h"
 #include "vp_render_cmd_packet.h"
+#include "igvp3dlut_args.h"
 
 namespace vp
 {
@@ -53,7 +54,11 @@
 MOS_STATUS VpHdrFilter::Destroy()
 {
     VP_FUNC_CALL();
-
+    for (auto &handle : m_renderHdr3DLutL0Params)
+    {
+        KRN_ARG &krnArg = handle.second;
+        MOS_FreeMemAndSetNull(krnArg.pData);
+    }
     return MOS_STATUS_SUCCESS;
 }
 
@@ -97,6 +102,8 @@
         m_veboxHdrParams.dstFormat            = hdrParams.formatOutput;
         m_veboxHdrParams.stage                = hdrParams.stage;
         m_veboxHdrParams.lutSize              = hdrParams.lutSize;
+        m_veboxHdrParams.isFp16Enable         = (hdrParams.formatInput == Format_A16B16G16R16F) ? true : false;
+        m_veboxHdrParams.external3DLutParams  = hdrParams.external3DLutParams;
     }
     else if (vpExecuteCaps.bRender && HDR_STAGE_3DLUT_KERNEL == hdrParams.stage)
     {
@@ -105,35 +112,116 @@
         m_renderHdr3DLutParams.maxDisplayLum       = hdrParams.uiMaxDisplayLum;
         m_renderHdr3DLutParams.maxContentLevelLum  = hdrParams.uiMaxContentLevelLum;
         m_renderHdr3DLutParams.hdrMode             = hdrParams.hdrMode;
-        m_renderHdr3DLutParams.kernelId            = (VpKernelID)kernelHdr3DLutCalc;
 
         m_renderHdr3DLutParams.threadWidth  = hdrParams.lutSize;
         m_renderHdr3DLutParams.threadHeight = hdrParams.lutSize;
 
-        KRN_ARG krnArg  = {};
-        krnArg.uIndex   = 0;
-        krnArg.eArgKind = ARG_KIND_SURFACE;
-        krnArg.uSize    = 4;
-        krnArg.pData    = &m_surfType3DLut;
-        m_renderHdr3DLutParams.kernelArgs.push_back(krnArg);
+        if (hdrParams.isL0KernelEnabled == false)
+        {
+            KRN_ARG krnArg  = {};
+            krnArg.uIndex   = 0;
+            krnArg.eArgKind = ARG_KIND_SURFACE;
+            krnArg.uSize    = 4;
+            krnArg.pData    = &m_surfType3DLut;
+            m_renderHdr3DLutParams.kernelArgs.push_back(krnArg);
 
-        krnArg.uIndex   = 1;
-        krnArg.eArgKind = ARG_KIND_SURFACE;
-        krnArg.uSize    = 4;
-        krnArg.pData    = &m_surfType3DLutCoef;
-        m_renderHdr3DLutParams.kernelArgs.push_back(krnArg);
+            krnArg.uIndex   = 1;
+            krnArg.eArgKind = ARG_KIND_SURFACE;
+            krnArg.uSize    = 4;
+            krnArg.pData    = &m_surfType3DLutCoef;
+            m_renderHdr3DLutParams.kernelArgs.push_back(krnArg);
 
-        krnArg.uIndex   = 2;
-        krnArg.eArgKind = ARG_KIND_GENERAL;
-        krnArg.uSize    = 2;
-        krnArg.pData    = &m_3DLutSurfaceWidth;
-        m_renderHdr3DLutParams.kernelArgs.push_back(krnArg);
+            krnArg.uIndex   = 2;
+            krnArg.eArgKind = ARG_KIND_GENERAL;
+            krnArg.uSize    = 2;
+            krnArg.pData    = &m_3DLutSurfaceWidth;
+            m_renderHdr3DLutParams.kernelArgs.push_back(krnArg);
 
-        krnArg.uIndex   = 3;
-        krnArg.eArgKind = ARG_KIND_GENERAL;
-        krnArg.uSize    = 2;
-        krnArg.pData    = &m_3DLutSurfaceHeight;
-        m_renderHdr3DLutParams.kernelArgs.push_back(krnArg);
+            krnArg.uIndex                   = 3;
+            krnArg.eArgKind                 = ARG_KIND_GENERAL;
+            krnArg.uSize                    = 2;
+            krnArg.pData                    = &m_3DLutSurfaceHeight;
+            m_renderHdr3DLutParams.kernelId = (VpKernelID)kernelHdr3DLutCalc;
+            m_renderHdr3DLutParams.kernelArgs.push_back(krnArg);
+        }
+        else
+        {
+            VP_PUBLIC_CHK_NULL_RETURN(m_pvpMhwInterface);
+            VP_PUBLIC_CHK_NULL_RETURN(m_pvpMhwInterface->m_vpPlatformInterface);
+
+            auto handle = m_pvpMhwInterface->m_vpPlatformInterface->GetKernelPool().find("fillLutTable_3dlut");
+            VP_PUBLIC_CHK_NOT_FOUND_RETURN(handle, &m_pvpMhwInterface->m_vpPlatformInterface->GetKernelPool());
+            KERNEL_ARGS kernelArgs             = handle->second.GetKernelArgs();
+            uint32_t    localWidth             = 128;
+            uint32_t    localHeight            = 1;
+            uint32_t    localDepth             = 1;
+            m_renderHdr3DLutParams.localWidth  = localWidth;
+            m_renderHdr3DLutParams.localHeight = localHeight;
+            m_renderHdr3DLutParams.kernelId    = (VpKernelID)kernelHdr3DLutCalcL0;
+
+            //step 1: setting curbe arguments
+            for (auto const &kernelArg : kernelArgs)
+            {
+                uint32_t uIndex    = kernelArg.uIndex;
+                auto     argHandle = m_renderHdr3DLutL0Params.find(uIndex);
+                if (argHandle == m_renderHdr3DLutL0Params.end())
+                {
+                    KRN_ARG krnArg = {};
+                    argHandle      = m_renderHdr3DLutL0Params.insert(std::make_pair(uIndex, krnArg)).first;
+                    VP_PUBLIC_CHK_NOT_FOUND_RETURN(argHandle, &m_renderHdr3DLutL0Params);
+                }
+                KRN_ARG &krnArg = argHandle->second;
+                krnArg.uIndex   = uIndex;
+                bool bInit      = true;
+                if (krnArg.pData == nullptr)
+                {
+                    if (kernelArg.uSize > 0)
+                    {
+                        krnArg.uSize = kernelArg.uSize;
+                        krnArg.pData = MOS_AllocAndZeroMemory(kernelArg.uSize);
+                    }
+                }
+                else
+                {
+                    VP_PUBLIC_CHK_VALUE_RETURN(krnArg.uSize, kernelArg.uSize);
+                    MOS_ZeroMemory(krnArg.pData, krnArg.uSize);
+                }
+                uint16_t mulSize = hdrParams.lutSize == 65 ? 128 : 64;
+                krnArg.eArgKind  = kernelArg.eArgKind;
+                switch (krnArg.uIndex)
+                {
+                case LUT_FILLLUTTABLE_IOLUTINDEX:
+                    VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
+                    *(uint32_t *)krnArg.pData = SurfaceType3DLut;
+                    break;
+                case LUT_FILLLUTTABLE_ICOEFINDEX:
+                    VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
+                    *(uint32_t *)krnArg.pData = SurfaceType3DLutCoef;
+                    break;
+                case LUT_FILLLUTTABLE_LUTSIZE:
+                    VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
+                    MOS_SecureMemcpy(krnArg.pData, kernelArg.uSize, &hdrParams.lutSize, sizeof(uint16_t));
+                    break;
+                case LUT_FILLLUTTABLE_MULSIZE:
+                    VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
+                    MOS_SecureMemcpy(krnArg.pData, kernelArg.uSize, &mulSize, sizeof(uint16_t));
+                    break;
+                case LUT_FILLLUTTABLE_LOCAL_SIZE:
+                    VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
+                    static_cast<uint32_t *>(krnArg.pData)[0] = localWidth;
+                    static_cast<uint32_t *>(krnArg.pData)[1] = localHeight;
+                    static_cast<uint32_t *>(krnArg.pData)[2] = localDepth;
+                    break;
+                default:
+                    bInit = false;
+                    break;
+                }
+                if (bInit)
+                {
+                    m_renderHdr3DLutParams.kernelArgs.push_back(krnArg);
+                }
+            }
+        }
     }
     else
     {
diff --git a/media_softlet/agnostic/common/vp/hal/features/vp_hdr_filter.h b/media_softlet/agnostic/common/vp/hal/features/vp_hdr_filter.h
index 8948cb9..73df414 100644
--- a/media_softlet/agnostic/common/vp/hal/features/vp_hdr_filter.h
+++ b/media_softlet/agnostic/common/vp/hal/features/vp_hdr_filter.h
@@ -243,6 +243,7 @@
     VEBOX_HDR_PARAMS m_veboxHdrParams = {};
     RENDER_HDR_3DLUT_CAL_PARAMS m_renderHdr3DLutParams = {};
     RENDER_HDR_PARAMS           m_renderHdrParams      = {};
+    KERNEL_INDEX_ARG_MAP        m_renderHdr3DLutL0Params = {};
     SwFilterPipe                *m_executedPipe        = nullptr;
 
     SurfaceType m_surfType3DLut         = SurfaceType3DLut;
diff --git a/media_softlet/agnostic/common/vp/hal/features/vp_l0_fc_filter.cpp b/media_softlet/agnostic/common/vp/hal/features/vp_l0_fc_filter.cpp
new file mode 100644
index 0000000..e29385c
--- /dev/null
+++ b/media_softlet/agnostic/common/vp/hal/features/vp_l0_fc_filter.cpp
@@ -0,0 +1,864 @@
+/*
+* Copyright (c) 2024, Intel Corporation
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*/
+//!
+//! \file     vp_l0_fc_filter.cpp
+//! \brief    Defines the common interface for denoise
+//!           this file is for the base interface which is shared by all l0 fc in driver.
+//!
+#include "vp_l0_fc_filter.h"
+#include "vp_render_cmd_packet.h"
+#include "hw_filter.h"
+#include "sw_filter_pipe.h"
+#include "vp_hal_ddi_utils.h"
+#include "igvpfc_scale_args.h"
+#include <vector>
+
+namespace vp
+{
+
+VpL0FcFilter::VpL0FcFilter(PVP_MHWINTERFACE vpMhwInterface) : VpFilter(vpMhwInterface)
+{
+}
+
+MOS_STATUS VpL0FcFilter::Init()
+{
+    VP_FUNC_CALL();
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS VpL0FcFilter::Prepare()
+{
+    VP_FUNC_CALL();
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS VpL0FcFilter::Destroy()
+{
+    VP_FUNC_CALL();
+
+    if (m_renderL0FcParams)
+    {
+        MOS_Delete(m_renderL0FcParams);
+        m_renderL0FcParams = nullptr;
+    }
+
+    for (auto &handle : m_scalingKrnArgs)
+    {
+        KRN_ARG &krnArg = handle.second;
+        MOS_FreeMemAndSetNull(krnArg.pData);
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+void L0_FC_KERNEL_PARAM::Init()
+{
+    kernelArgs.clear();
+    kernelName.clear();
+    kernelId     = kernelCombinedFc;
+    threadWidth  = 0;
+    threadHeight = 0;
+}
+
+void _RENDER_L0_FC_PARAMS::Init()
+{
+    fc_kernelParams.clear();
+}
+
+MOS_STATUS VpL0FcFilter::SetExecuteEngineCaps(
+    SwFilterPipe   *executingPipe,
+    VP_EXECUTE_CAPS vpExecuteCaps)
+{
+    VP_FUNC_CALL();
+
+    m_executingPipe = executingPipe;
+    m_executeCaps  = vpExecuteCaps;
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS VpL0FcFilter::InitCompParams(L0_FC_KERNEL_PARAMS &compParams, SwFilterPipe &executingPipe)
+{
+    MOS_ZeroMemory(&compParams, sizeof(compParams));
+
+    //L0 FC only supports scaling kernel only for now
+    for (uint32_t layerIndex = 0; layerIndex < executingPipe.GetSurfaceCount(true); ++layerIndex)
+    {
+        SwFilterScaling   *scaling         = dynamic_cast<SwFilterScaling *>(executingPipe.GetSwFilter(true, 0, FeatureType::FeatureTypeScaling));
+        L0_FC_KERNEL_PARAM scalingKrnParam = {};
+        VP_PUBLIC_CHK_STATUS_RETURN(AddScalingKrn(scaling, SurfaceType(SurfaceTypeFcInputLayer0 + layerIndex), SurfaceTypeFcTarget0, scalingKrnParam));
+        compParams.push_back(scalingKrnParam);
+    }
+    
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS VpL0FcFilter::AddScalingKrn(SwFilterScaling *scaling, SurfaceType inputSurf, SurfaceType outputSurf, L0_FC_KERNEL_PARAM &param)
+{
+    VP_PUBLIC_CHK_NULL_RETURN(m_pvpMhwInterface);
+    VP_PUBLIC_CHK_NULL_RETURN(m_pvpMhwInterface->m_vpPlatformInterface);
+    VP_PUBLIC_CHK_NULL_RETURN(scaling);
+    RECT srcRect = scaling->GetSwFilterParams().input.rcSrc;
+    RECT trgRect = scaling->GetSwFilterParams().input.rcDst;
+
+    if (scaling->GetSwFilterParams().interlacedScalingType != ISCALING_NONE ||
+        !IS_ALPHA_FORMAT_RGB8(scaling->GetSwFilterParams().formatInput) ||
+        !IS_ALPHA_FORMAT_RGB8(scaling->GetSwFilterParams().formatOutput) ||
+        srcRect.left != 0 ||
+        srcRect.top  != 0 ||
+        trgRect.left != 0 ||
+        trgRect.top  != 0)
+    {
+        //L0 FC only support RGB32 right now
+        //L0 FC only support no left/top cropping now
+        VP_PUBLIC_CHK_STATUS_RETURN(MOS_STATUS_INVALID_PARAMETER);
+    }
+
+    
+    uint32_t    inputWidth   = MOS_MIN(scaling->GetSwFilterParams().input.dwWidth, static_cast<uint32_t>(srcRect.right - srcRect.left));
+    uint32_t    inputHeight  = MOS_MIN(scaling->GetSwFilterParams().input.dwHeight, static_cast<uint32_t>(srcRect.bottom - srcRect.top));
+    uint32_t    targetWidth  = scaling->GetSwFilterParams().output.dwWidth;
+    uint32_t    targetHeight = scaling->GetSwFilterParams().output.dwHeight;
+    uint32_t    bitNumber    = 8;
+    float       shift[2]     = {VP_HW_LINEAR_SHIFT, VP_HW_LINEAR_SHIFT};
+    float       offset[2]    = {VP_SAMPLER_BIAS, VP_SAMPLER_BIAS};
+    uint32_t    localWidth   = 32;
+    uint32_t    localHeight  = 32;
+    uint32_t    localDepth   = 1;
+    uint32_t    threadWidth  = targetWidth / localWidth + (targetWidth % localWidth != 0);
+    uint32_t    threadHeight = targetHeight / localHeight + (targetHeight % localHeight != 0);
+    KERNEL_ARGS krnArgs      = {};
+    param                    = {};
+
+    auto handle = m_pvpMhwInterface->m_vpPlatformInterface->GetKernelPool().find("PA_444D_fc_scale");
+    VP_PUBLIC_CHK_NOT_FOUND_RETURN(handle, &m_pvpMhwInterface->m_vpPlatformInterface->GetKernelPool());
+    KERNEL_BTIS kernelBtis = handle->second.GetKernelBtis();
+    KERNEL_ARGS kernelArgs = handle->second.GetKernelArgs();
+
+    for (auto const &kernelArg : kernelArgs)
+    {
+        uint32_t uIndex    = kernelArg.uIndex;
+        auto     argHandle = m_scalingKrnArgs.find(uIndex);
+        if (argHandle == m_scalingKrnArgs.end())
+        {
+            KRN_ARG krnArg = {};
+            argHandle      = m_scalingKrnArgs.insert(std::make_pair(uIndex, krnArg)).first;
+            VP_PUBLIC_CHK_NOT_FOUND_RETURN(argHandle, &m_scalingKrnArgs);
+        }
+        KRN_ARG &krnArg = argHandle->second;
+        bool     bInit  = true;
+        krnArg.uIndex   = uIndex;
+        krnArg.eArgKind = kernelArg.eArgKind;
+        if (krnArg.pData == nullptr)
+        {
+            if (kernelArg.uSize > 0)
+            {
+                krnArg.uSize = kernelArg.uSize;
+                krnArg.pData = MOS_AllocAndZeroMemory(kernelArg.uSize);
+            }
+        }
+        else
+        {
+            VP_PUBLIC_CHK_VALUE_RETURN(krnArg.uSize, kernelArg.uSize);
+            MOS_ZeroMemory(krnArg.pData, krnArg.uSize);
+        }
+
+        switch (krnArg.uIndex)
+        {
+        case FC_SCALE_PA_444D_OUTPUT_IMAGE_HEIGHT:
+            VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
+            *(uint32_t *)krnArg.pData = targetHeight;
+            break;
+        case FC_SCALE_PA_444D_OUTPUT_IMAGE_WIDTH:
+            VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
+            *(uint32_t *)krnArg.pData = targetWidth;
+            break;
+        case FC_SCALE_PA_444D_INPUT_IMAGE_WIDTH:
+            VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
+            *(uint32_t *)krnArg.pData = inputWidth;
+            break;
+        case FC_SCALE_PA_444D_INPUT_IMAGE_HEIGHT:
+            VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
+            *(uint32_t *)krnArg.pData = inputHeight;
+            break;
+        case FC_SCALE_PA_444D_BITNUM:
+            VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
+            *(uint32_t *)krnArg.pData = bitNumber;
+            break;
+        case FC_SCALE_PA_444D_SHIFT:
+            VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
+            MOS_SecureMemcpy(krnArg.pData, krnArg.uSize, shift, sizeof(shift));
+            break;
+        case FC_SCALE_PA_444D_OFFSET:
+            VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
+            MOS_SecureMemcpy(krnArg.pData, krnArg.uSize, offset, sizeof(offset));
+            break;
+        case FC_SCALE_PA_444D_INPUTIMAGESMPL:
+            krnArg.uOffsetInPayload = kernelArg.uOffsetInPayload;
+            break;
+        case FC_SCALE_PA_444D_ENQUEUED_LOCAL_SIZE:
+        case FC_SCALE_PA_444D_LOCAL_SIZE:
+            VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
+            static_cast<uint32_t *>(krnArg.pData)[0] = localWidth;
+            static_cast<uint32_t *>(krnArg.pData)[1] = localHeight;
+            static_cast<uint32_t *>(krnArg.pData)[2] = localDepth;
+            break;
+        default:
+            bInit = false;
+            break;
+        }
+
+        if (bInit)
+        {
+            krnArgs.push_back(krnArg);
+        }
+    }
+
+    for (auto const &kernelBti : kernelBtis)
+    {
+        uint32_t uIndex    = kernelBti.first;
+        auto     argHandle = m_scalingKrnArgs.find(uIndex);
+        if (argHandle == m_scalingKrnArgs.end())
+        {
+            KRN_ARG krnArg = {};
+            argHandle      = m_scalingKrnArgs.insert(std::make_pair(uIndex, krnArg)).first;
+            VP_PUBLIC_CHK_NOT_FOUND_RETURN(argHandle, &m_scalingKrnArgs);
+        }
+        KRN_ARG &krnArg = argHandle->second;
+        krnArg.uIndex   = uIndex;
+        krnArg.eArgKind = ARG_KIND_SURFACE;
+        bool bInit      = true;
+        if (krnArg.pData == nullptr)
+        {
+            krnArg.uSize = 8;
+            krnArg.pData = MOS_AllocAndZeroMemory(krnArg.uSize);
+            VP_PUBLIC_CHK_NULL_RETURN(krnArg.pData);
+        }
+        else
+        {
+            VP_PUBLIC_CHK_VALUE_RETURN(krnArg.uSize, 8);
+            MOS_ZeroMemory(krnArg.pData, krnArg.uSize);
+        }
+
+        switch (krnArg.uIndex)
+        {
+        case FC_SCALE_PA_444D_INPUT:
+            *(uint32_t *)krnArg.pData = inputSurf;
+            break;
+        case FC_SCALE_PA_444D_OUTPUT:
+            *(uint32_t *)krnArg.pData = outputSurf;
+            break;
+        default:
+            bInit = false;
+            break;
+        }
+
+        if (bInit)
+        {
+            krnArgs.push_back(krnArg);
+        }
+    }
+
+    param.kernelArgs   = krnArgs;
+    param.kernelName   = "PA_444D_fc_scale";
+    param.kernelId     = kernelFcDScale444;
+    param.threadWidth  = threadWidth;
+    param.threadHeight = threadHeight;
+    param.localWidth   = localWidth;
+    param.localHeight  = localHeight;
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS VpL0FcFilter::CalculateEngineParams()
+{
+    VP_FUNC_CALL();
+    if (m_executeCaps.bRender)
+    {
+        // create a filter Param buffer
+        if (!m_renderL0FcParams)
+        {
+            m_renderL0FcParams = (PRENDER_L0_FC_PARAMS)MOS_New(RENDER_L0_FC_PARAMS);
+
+            if (m_renderL0FcParams == nullptr)
+            {
+                VP_PUBLIC_ASSERTMESSAGE("render l0 fc Pamas buffer allocate failed, return nullpointer");
+                return MOS_STATUS_NO_SPACE;
+            }
+        }
+        else
+        {
+            m_renderL0FcParams->Init();
+        }
+
+        InitCompParams(m_renderL0FcParams->fc_kernelParams, *m_executingPipe);
+    }
+    else
+    {
+        VP_PUBLIC_ASSERTMESSAGE("Wrong engine caps! Vebox should be used for Dn");
+    }
+    return MOS_STATUS_SUCCESS;
+}
+
+
+/****************************************************************************************************/
+/*                                   HwFilter L0 Fc Parameter                                          */
+/****************************************************************************************************/
+HwFilterParameter *HwFilterL0FcParameter::Create(HW_FILTER_L0_FC_PARAM &param, FeatureType featureType)
+{
+    VP_FUNC_CALL();
+
+    HwFilterL0FcParameter *p = MOS_New(HwFilterL0FcParameter, featureType);
+    if (p)
+    {
+        if (MOS_FAILED(p->Initialize(param)))
+        {
+            MOS_Delete(p);
+            return nullptr;
+        }
+    }
+    return p;
+}
+
+HwFilterL0FcParameter::HwFilterL0FcParameter(FeatureType featureType) : HwFilterParameter(featureType)
+{
+}
+
+HwFilterL0FcParameter::~HwFilterL0FcParameter()
+{
+}
+
+MOS_STATUS HwFilterL0FcParameter::ConfigParams(HwFilter &hwFilter)
+{
+    VP_FUNC_CALL();
+
+    return hwFilter.ConfigParam(m_Params);
+}
+
+MOS_STATUS HwFilterL0FcParameter::Initialize(HW_FILTER_L0_FC_PARAM &param)
+{
+    VP_FUNC_CALL();
+
+    m_Params = param;
+    return MOS_STATUS_SUCCESS;
+}
+
+
+/****************************************************************************************************/
+/*                                   Packet L0 Fc Parameter                                       */
+/****************************************************************************************************/
+VpPacketParameter *VpRenderL0FcParameter::Create(HW_FILTER_L0_FC_PARAM &param)
+{
+    VP_FUNC_CALL();
+
+    if (nullptr == param.pPacketParamFactory)
+    {
+        return nullptr;
+    }
+    VpRenderL0FcParameter *p = dynamic_cast<VpRenderL0FcParameter *>(param.pPacketParamFactory->GetPacketParameter(param.pHwInterface));
+    if (p)
+    {
+        if (MOS_FAILED(p->Initialize(param)))
+        {
+            VpPacketParameter *pParam = p;
+            param.pPacketParamFactory->ReturnPacketParameter(pParam);
+            return nullptr;
+        }
+    }
+    return p;
+}
+
+VpRenderL0FcParameter::VpRenderL0FcParameter(PVP_MHWINTERFACE pHwInterface, PacketParamFactoryBase *packetParamFactory) : VpPacketParameter(packetParamFactory), m_fcFilter(pHwInterface)
+{
+}
+VpRenderL0FcParameter::~VpRenderL0FcParameter() {}
+
+bool VpRenderL0FcParameter::SetPacketParam(VpCmdPacket *pPacket)
+{
+    VP_FUNC_CALL();
+
+    VpRenderCmdPacket *renderPacket = dynamic_cast<VpRenderCmdPacket *>(pPacket);
+    if (nullptr == renderPacket)
+    {
+        return false;
+    }
+
+    PRENDER_L0_FC_PARAMS params = m_fcFilter.GetFcParams();
+    if (nullptr == params)
+    {
+        return false;
+    }
+    return MOS_SUCCEEDED(renderPacket->SetL0FcParams(params));
+}
+
+MOS_STATUS VpRenderL0FcParameter::Initialize(HW_FILTER_L0_FC_PARAM &params)
+{
+    VP_FUNC_CALL();
+
+    VP_PUBLIC_CHK_STATUS_RETURN(m_fcFilter.Init());
+    VP_PUBLIC_CHK_STATUS_RETURN(m_fcFilter.SetExecuteEngineCaps(params.executingPipe, params.vpExecuteCaps));
+    VP_PUBLIC_CHK_STATUS_RETURN(m_fcFilter.CalculateEngineParams());
+    return MOS_STATUS_SUCCESS;
+}
+
+
+/****************************************************************************************************/
+/*                                   Policy FC Feature Handler                                      */
+/****************************************************************************************************/
+
+MOS_STATUS PolicyL0FcFeatureHandler::UpdateFeaturePipe(VP_EXECUTE_CAPS caps, SwFilter &feature, SwFilterPipe &featurePipe, SwFilterPipe &executePipe, bool isInputPipe, int index)
+{
+    VP_FUNC_CALL();
+
+    FeatureType type = feature.GetFeatureType();
+
+    if (caps.bRenderHdr)
+    {
+        // HDR Kernel
+        return PolicyFeatureHandler::UpdateFeaturePipe(caps, feature, featurePipe, executePipe, isInputPipe, index);
+    }
+    else
+    {
+        // FC
+        if (FeatureTypeLumakeyOnRender == type ||
+            FeatureTypeBlendingOnRender == type ||
+            FeatureTypeAlphaOnRender == type ||
+            FeatureTypeCscOnRender == type ||
+            FeatureTypeScalingOnRender == type ||
+            FeatureTypeRotMirOnRender == type ||
+            FeatureTypeDiOnRender == type ||
+            FeatureTypeProcampOnRender == type)
+        {
+            return PolicyFeatureHandler::UpdateFeaturePipe(caps, feature, featurePipe, executePipe, isInputPipe, index);
+        }
+        else if (FeatureTypeColorFillOnRender == type)
+        {
+            // Only apply color fill on 1st pass.
+            VP_PUBLIC_CHK_STATUS_RETURN(featurePipe.RemoveSwFilter(&feature));
+            VP_PUBLIC_CHK_STATUS_RETURN(executePipe.AddSwFilterUnordered(&feature, isInputPipe, index));
+        }
+        else
+        {
+            VP_PUBLIC_CHK_STATUS_RETURN(MOS_STATUS_INVALID_PARAMETER);
+        }
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS PolicyL0FcFeatureHandler::UpdateUnusedFeature(VP_EXECUTE_CAPS caps, SwFilter &feature, SwFilterPipe &featurePipe, SwFilterPipe &executePipe, bool isInputPipe, int index)
+{
+    // feature.GetFilterEngineCaps().bEnabled should be used here instead of feature.IsFeatureEnabled(caps)
+    // to ensure the feature does not be enabled.
+    // feature.IsFeatureEnabled(caps) being false means the feature is not being used in current workload,
+    // in which case, the feature itself may be enable and need be processed in following workloads.
+    if (0 == caps.bOutputPipeFeatureInuse &&
+        !feature.GetFilterEngineCaps().bEnabled &&
+        (feature.GetFilterEngineCaps().forceEnableForSfc ||
+            feature.GetFilterEngineCaps().forceEnableForFc))
+    {
+        // To avoid filter being destroyed in Policy::UpdateFeaturePipe.
+        feature.GetFilterEngineCaps().usedForNextPass = 1;
+    }
+    return MOS_STATUS_SUCCESS;
+}
+
+/****************************************************************************************************/
+/*                                   Policy FC Handler                                              */
+/****************************************************************************************************/
+PolicyL0FcHandler::PolicyL0FcHandler(VP_HW_CAPS &hwCaps) : PolicyFeatureHandler(hwCaps)
+{
+    m_Type = FeatureTypeFc;
+}
+PolicyL0FcHandler::~PolicyL0FcHandler()
+{
+}
+
+bool PolicyL0FcHandler::IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps)
+{
+    VP_FUNC_CALL();
+
+    return vpExecuteCaps.bComposite;
+}
+
+HwFilterParameter *PolicyL0FcHandler::CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe &swFilterPipe, PVP_MHWINTERFACE pHwInterface)
+{
+    VP_FUNC_CALL();
+
+    if (IsFeatureEnabled(vpExecuteCaps))
+    {
+        HW_FILTER_L0_FC_PARAM param   = {};
+        param.type                 = m_Type;
+        param.pHwInterface         = pHwInterface;
+        param.vpExecuteCaps        = vpExecuteCaps;
+        param.pPacketParamFactory  = &m_PacketParamFactory;
+        param.executingPipe        = &swFilterPipe;
+        param.pfnCreatePacketParam = PolicyL0FcHandler::CreatePacketParam;
+
+        HwFilterParameter *pHwFilterParam = GetHwFeatureParameterFromPool();
+
+        if (pHwFilterParam)
+        {
+            if (MOS_FAILED(((HwFilterL0FcParameter *)pHwFilterParam)->Initialize(param)))
+            {
+                ReleaseHwFeatureParameter(pHwFilterParam);
+            }
+        }
+        else
+        {
+            pHwFilterParam = HwFilterL0FcParameter::Create(param, m_Type);
+        }
+
+        return pHwFilterParam;
+    }
+    else
+    {
+        return nullptr;
+    }
+}
+
+MOS_STATUS PolicyL0FcHandler::UpdateFeaturePipe(VP_EXECUTE_CAPS caps, SwFilter &feature, SwFilterPipe &featurePipe, SwFilterPipe &executePipe, bool isInputPipe, int index)
+{
+    VP_FUNC_CALL();
+    VP_PUBLIC_ASSERTMESSAGE("Should not coming here!");
+    return MOS_STATUS_SUCCESS;
+}
+
+bool IsInterlacedInputSupported(VP_SURFACE &input);
+
+bool IsBobDiEnabled(SwFilterDeinterlace *di, VP_SURFACE &input);
+
+static MOS_STATUS IsChromaSamplingNeeded(bool &isChromaUpSamplingNeeded, bool &isChromaDownSamplingNeeded, VPHAL_SURFACE_TYPE surfType, int layerIndex, MOS_FORMAT inputFormat, MOS_FORMAT outputFormat)
+{
+    VPHAL_COLORPACK srcColorPack = VpHalDDIUtils::GetSurfaceColorPack(inputFormat);
+    VPHAL_COLORPACK dstColorPack = VpHalDDIUtils::GetSurfaceColorPack(outputFormat);
+
+    if (SURF_IN_PRIMARY == surfType &&
+        // when 3D sampler been used, PL2 chromasitting kernel does not support sub-layer chromasitting
+        ((IS_PL2_FORMAT(inputFormat) && 0 == layerIndex) ||
+            inputFormat == Format_YUY2))
+    {
+        isChromaUpSamplingNeeded   = ((srcColorPack == VPHAL_COLORPACK_420 &&
+                                        (dstColorPack == VPHAL_COLORPACK_422 || dstColorPack == VPHAL_COLORPACK_444)) ||
+                                    (srcColorPack == VPHAL_COLORPACK_422 && dstColorPack == VPHAL_COLORPACK_444));
+        isChromaDownSamplingNeeded = ((srcColorPack == VPHAL_COLORPACK_444 &&
+                                          (dstColorPack == VPHAL_COLORPACK_422 || dstColorPack == VPHAL_COLORPACK_420)) ||
+                                      (srcColorPack == VPHAL_COLORPACK_422 && dstColorPack == VPHAL_COLORPACK_420));
+    }
+    else
+    {
+        isChromaUpSamplingNeeded   = false;
+        isChromaDownSamplingNeeded = false;
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+static MOS_STATUS Get3DSamplerScalingMode(VPHAL_SCALING_MODE &scalingMode, SwFilterSubPipe &pipe, int layerIndex, VP_SURFACE &input, VP_SURFACE &output)
+{
+    bool isChromaUpSamplingNeeded   = false;
+    bool isChromaDownSamplingNeeded = false;
+    VP_PUBLIC_CHK_STATUS_RETURN(IsChromaSamplingNeeded(isChromaUpSamplingNeeded, isChromaDownSamplingNeeded, input.SurfType, layerIndex, input.osSurface->Format, output.osSurface->Format));
+
+    SwFilterScaling *scaling = dynamic_cast<SwFilterScaling *>(pipe.GetSwFilter(FeatureType::FeatureTypeScaling));
+
+    bool iscalingEnabled = scaling ? ISCALING_INTERLEAVED_TO_INTERLEAVED == scaling->GetSwFilterParams().interlacedScalingType : false;
+    bool fieldWeaving    = scaling ? ISCALING_FIELD_TO_INTERLEAVED == scaling->GetSwFilterParams().interlacedScalingType : false;
+
+    // The rectangle in VP_SURFACE contains the rotation information.
+    // The rectangle in ScalingFilter has been adjusted based on the rotation,
+    // which can be used directly here.
+    bool isScalingNeeded = false;
+    if (scaling)
+    {
+        auto &scalingParamsInput = scaling->GetSwFilterParams().input;
+        isScalingNeeded          = (scalingParamsInput.rcDst.right - scalingParamsInput.rcDst.left) != (scalingParamsInput.rcSrc.right - scalingParamsInput.rcSrc.left) ||
+                          (scalingParamsInput.rcDst.bottom - scalingParamsInput.rcDst.top) != (scalingParamsInput.rcSrc.bottom - scalingParamsInput.rcSrc.top);
+    }
+    else
+    {
+        isScalingNeeded = false;
+    }
+
+    if (!isScalingNeeded &&
+        !isChromaUpSamplingNeeded &&
+        !isChromaDownSamplingNeeded &&
+        (input.SampleType == SAMPLE_PROGRESSIVE || iscalingEnabled || fieldWeaving))
+    {
+        scalingMode = VPHAL_SCALING_NEAREST;
+    }
+    else
+    {
+        scalingMode = VPHAL_SCALING_BILINEAR;
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS PolicyL0FcHandler::AddInputLayerForProcess(bool &bSkip, std::vector<int> &layerIndexes, VPHAL_SCALING_MODE &scalingMode, int index, VP_SURFACE &input, SwFilterSubPipe &pipe, VP_SURFACE &output, VP_EXECUTE_CAPS &caps)
+{
+    bSkip = false;
+    --m_resCounter.layers;
+
+    if (VPHAL_PALETTE_NONE != input.Palette.PaletteType)
+    {
+        --m_resCounter.palettes;
+    }
+
+    SwFilterProcamp *procamp = dynamic_cast<SwFilterProcamp *>(pipe.GetSwFilter(FeatureType::FeatureTypeProcamp));
+    if (procamp && procamp->IsFeatureEnabled(caps) &&
+        procamp->GetSwFilterParams().procampParams &&
+        procamp->GetSwFilterParams().procampParams->bEnabled)
+    {
+        --m_resCounter.procamp;
+    }
+
+    SwFilterLumakey *lumakey = dynamic_cast<SwFilterLumakey *>(pipe.GetSwFilter(FeatureType::FeatureTypeLumakey));
+    if (lumakey)
+    {
+        --m_resCounter.lumaKeys;
+        if (m_resCounter.lumaKeys < 0 || layerIndexes.size() > 1)
+        {
+            bSkip = true;
+            VP_PUBLIC_NORMALMESSAGE("Scaling Info: layer %d is not selected. lumaKeys %d, layerIndexes.size() %d",
+                index,
+                m_resCounter.lumaKeys,
+                layerIndexes.size());
+            return MOS_STATUS_SUCCESS;
+        }
+        if (layerIndexes.size() == 1)
+        {
+            m_resCounter.sampler = VP_COMP_MAX_SAMPLER;
+        }
+    }
+
+    SwFilterScaling     *scaling               = dynamic_cast<SwFilterScaling *>(pipe.GetSwFilter(FeatureType::FeatureTypeScaling));
+    SwFilterDeinterlace *di                    = dynamic_cast<SwFilterDeinterlace *>(pipe.GetSwFilter(FeatureType::FeatureTypeDi));
+    VPHAL_SAMPLE_TYPE    sampleType            = input.SampleType;
+    bool                 samplerLumakeyEnabled = m_hwCaps.m_rules.isAvsSamplerSupported;
+
+    if (nullptr == scaling)
+    {
+        VP_PUBLIC_ASSERTMESSAGE("Scaling Info: Scaling filter does not exist on layer %d!", index);
+        VP_PUBLIC_CHK_NULL_RETURN(scaling);
+    }
+
+    scalingMode = scaling->GetSwFilterParams().scalingMode;
+
+    // Disable AVS scaling mode
+    if (!m_hwCaps.m_rules.isAvsSamplerSupported)
+    {
+        if (VPHAL_SCALING_AVS == scalingMode)
+        {
+            scalingMode = VPHAL_SCALING_BILINEAR;
+        }
+    }
+
+    if (!IsInterlacedInputSupported(input))
+    {
+        sampleType = SAMPLE_PROGRESSIVE;
+        // Disable DI
+        if (di && di->IsFeatureEnabled(caps))
+        {
+            di->GetFilterEngineCaps().bEnabled = false;
+        }
+        // Disable Iscaling
+        if (scaling->IsFeatureEnabled(caps) &&
+            ISCALING_NONE != scaling->GetSwFilterParams().interlacedScalingType)
+        {
+            scaling->GetSwFilterParams().interlacedScalingType = ISCALING_NONE;
+        }
+    }
+
+    // Number of AVS, but lumaKey and BOB DI needs 3D sampler instead of AVS sampler.
+    if (VPHAL_SCALING_AVS == scalingMode &&
+        nullptr == lumakey && !IsBobDiEnabled(di, input))
+    {
+        --m_resCounter.avs;
+    }
+    // Number of Sampler filter mode, we had better only support Nearest or Bilinear filter in one phase
+    // If two filters are used together, the later filter overwrite the first and cause output quality issue.
+    else
+    {
+        VP_PUBLIC_CHK_STATUS_RETURN(Get3DSamplerScalingMode(scalingMode, pipe, layerIndexes.size(), input, output));
+
+        // If bilinear needed for one layer, it will also be used by other layers.
+        // nearest only be used if it is used by all layers.
+        int32_t samplerMask = (VP_COMP_SAMPLER_BILINEAR | VP_COMP_SAMPLER_NEAREST);
+
+        // Use sampler luma key feature only if this is not the bottom most layer
+        if (samplerLumakeyEnabled && lumakey && layerIndexes.size() > 0 && !IS_PL3_FORMAT(input.osSurface->Format))
+        {
+            m_resCounter.sampler &= VP_COMP_SAMPLER_LUMAKEY;
+        }
+        else if (m_resCounter.sampler & samplerMask)
+        {
+            m_resCounter.sampler &= samplerMask;
+        }
+        else
+        {
+            // switch to AVS if AVS sampler is not used, decrease the count of comp phase
+            // For isAvsSamplerSupported == false case, curent layer will be rejected, since m_resCounter.avs == 0.
+            scalingMode = VPHAL_SCALING_AVS;
+            --m_resCounter.avs;
+        }
+    }
+
+    // Fails if any of the limits are reached
+    // Output structure has reason why failed :-)
+    // multi-passes if rotation is not the same as Layer 0 rotation
+    // single pass if Primary layer needs rotation and remaining layer does not need rotation
+    if (m_resCounter.layers < 0 ||
+        m_resCounter.palettes < 0 ||
+        m_resCounter.procamp < 0 ||
+        m_resCounter.lumaKeys < 0 ||
+        m_resCounter.avs < 0 ||
+        m_resCounter.sampler == 0)
+    {
+        //Multipass
+        bSkip = true;
+        VP_PUBLIC_NORMALMESSAGE("Scaling Info: layer %d is not selected. layers %d, palettes %d, procamp %d, lumaKeys %d, avs %d, sampler %d",
+            index,
+            m_resCounter.layers,
+            m_resCounter.palettes,
+            m_resCounter.procamp,
+            m_resCounter.lumaKeys,
+            m_resCounter.avs,
+            m_resCounter.sampler);
+        return MOS_STATUS_SUCCESS;
+    }
+
+    VP_PUBLIC_NORMALMESSAGE("Scaling Info: scalingMode %d is selected for layer %d", scalingMode, index);
+    MT_LOG2(MT_VP_HAL_FC_SCALINGINFO, MT_NORMAL, MT_VP_HAL_FC_LAYER, index, MT_VP_HAL_SCALING_MODE, scalingMode);
+
+    // Append source to compositing operation
+    scaling->GetSwFilterParams().scalingMode = scalingMode;
+
+    if (di)
+    {
+        di->GetSwFilterParams().sampleTypeInput = sampleType;
+    }
+
+    input.SampleType = sampleType;
+    layerIndexes.push_back(index);
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS PolicyL0FcHandler::RemoveTransparentLayers(SwFilterPipe &featurePipe)
+{
+    for (uint32_t i = 0; i < featurePipe.GetSurfaceCount(true); ++i)
+    {
+        SwFilterSubPipe *subpipe = featurePipe.GetSwFilterSubPipe(true, i);
+
+        auto blending = dynamic_cast<SwFilterBlending *>(featurePipe.GetSwFilter(true, i, FeatureTypeBlending));
+        if (nullptr == blending)
+        {
+            continue;
+        }
+
+        auto &param = blending->GetSwFilterParams();
+
+        //-----------------------------------
+        // Alpha blending optimization.
+        // If Constant blending and one of the following is true, disable blending.
+        // If Src+Constant blending and one of the following is true, fall back to Src blending.
+        // Condition; alpha <= 0. Layer is 100% transparent.
+        // Condition; alpha >= 1. Layer is 100% opaque.
+        //-----------------------------------
+        if (param.blendingParams &&
+            ((param.blendingParams->BlendType == BLEND_CONSTANT) ||
+                (param.blendingParams->BlendType == BLEND_CONSTANT_SOURCE) ||
+                (param.blendingParams->BlendType == BLEND_CONSTANT_PARTIAL)))
+        {
+            float fAlpha = param.blendingParams->fAlpha;
+
+            // Don't render layer with alpha <= 0.0f
+            if (fAlpha <= 0.0f)
+            {
+                VP_PUBLIC_NORMALMESSAGE("Layer %d skipped: BlendType %d, fAlpha %d",
+                    i,
+                    param.blendingParams->BlendType,
+                    param.blendingParams->fAlpha);
+                VP_PUBLIC_CHK_STATUS_RETURN(featurePipe.DestroySurface(true, i));
+            }
+        }
+    }
+    featurePipe.Update();
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS PolicyL0FcHandler::LayerSelectForProcess(std::vector<int> &layerIndexes, SwFilterPipe &featurePipe, VP_EXECUTE_CAPS &caps)
+{
+    layerIndexes.clear();
+    m_resCounter.Reset(m_hwCaps.m_rules.isAvsSamplerSupported);
+
+    VP_PUBLIC_CHK_STATUS_RETURN(RemoveTransparentLayers(featurePipe));
+
+    bool        skip                      = false;
+    VP_SURFACE *output                    = featurePipe.GetSurface(false, 0);
+    bool        bilinearInUseFor3DSampler = false;
+    VP_PUBLIC_CHK_NULL_RETURN(output);
+
+    for (uint32_t i = 0; i < featurePipe.GetSurfaceCount(true); ++i)
+    {
+        VPHAL_SCALING_MODE scalingMode = VPHAL_SCALING_NEAREST;
+        VP_SURFACE        *input       = featurePipe.GetSurface(true, i);
+        SwFilterSubPipe   *subpipe     = featurePipe.GetSwFilterSubPipe(true, i);
+        VP_PUBLIC_CHK_NULL_RETURN(input);
+        VP_PUBLIC_CHK_NULL_RETURN(subpipe);
+        VP_PUBLIC_CHK_STATUS_RETURN(AddInputLayerForProcess(skip, layerIndexes, scalingMode, i, *input, *subpipe, *output, caps));
+        if (skip)
+        {
+            break;
+        }
+
+        if (VPHAL_SCALING_BILINEAR == scalingMode)
+        {
+            bilinearInUseFor3DSampler = true;
+        }
+    }
+
+    // Use bilinear for layers, which is using nearest.
+    if (bilinearInUseFor3DSampler)
+    {
+        for (uint32_t i = 0; i < layerIndexes.size(); ++i)
+        {
+            SwFilterSubPipe *subpipe = featurePipe.GetSwFilterSubPipe(true, layerIndexes[i]);
+            VP_PUBLIC_CHK_NULL_RETURN(subpipe);
+            SwFilterScaling *scaling = dynamic_cast<SwFilterScaling *>(subpipe->GetSwFilter(FeatureType::FeatureTypeScaling));
+            if (scaling && VPHAL_SCALING_NEAREST == scaling->GetSwFilterParams().scalingMode)
+            {
+                scaling->GetSwFilterParams().scalingMode = VPHAL_SCALING_BILINEAR;
+                VP_PUBLIC_NORMALMESSAGE("Scaling Info: Force nearest to bilinear for layer %d (%d)", layerIndexes[i], i);
+                MT_LOG3(MT_VP_HAL_FC_SCALINGINFO, MT_NORMAL, MT_VP_HAL_FC_LAYER, layerIndexes[i], MT_VP_HAL_SCALING_MODE, VPHAL_SCALING_NEAREST, MT_VP_HAL_SCALING_MODE_FORCE, VPHAL_SCALING_BILINEAR);
+            }
+        }
+    }
+
+    // No procamp in target being used.
+    return MOS_STATUS_SUCCESS;
+}
+}
\ No newline at end of file
diff --git a/media_softlet/agnostic/common/vp/hal/features/vp_l0_fc_filter.h b/media_softlet/agnostic/common/vp/hal/features/vp_l0_fc_filter.h
new file mode 100644
index 0000000..f113699
--- /dev/null
+++ b/media_softlet/agnostic/common/vp/hal/features/vp_l0_fc_filter.h
@@ -0,0 +1,216 @@
+/*
+* Copyright (c) 2024, Intel Corporation
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*/
+//!
+//! \file     vp_l0_fc_filter.h
+//! \brief    Defines the common interface for denoise
+//!           this file is for the base interface which is shared by all l0 fc in driver.
+
+
+#ifndef __VP_L0_FC_FILTER_H__
+#define __VP_L0_FC_FILTER_H__
+#include "vp_filter.h"
+#include "sw_filter.h"
+
+namespace vp{
+
+struct L0_FC_KERNEL_PARAM
+{
+    KERNEL_ARGS kernelArgs;
+    std::string kernelName;
+    VpKernelID  kernelId;
+    uint32_t    threadWidth;
+    uint32_t    threadHeight;
+    uint32_t    localWidth;
+    uint32_t    localHeight;
+    void        Init();
+};
+
+using L0_FC_KERNEL_PARAMS = std::vector<L0_FC_KERNEL_PARAM>;
+struct _RENDER_L0_FC_PARAMS
+{
+    L0_FC_KERNEL_PARAMS fc_kernelParams = {};
+    void                            Init();
+};
+using RENDER_L0_FC_PARAMS  = _RENDER_L0_FC_PARAMS;
+using PRENDER_L0_FC_PARAMS = RENDER_L0_FC_PARAMS *;
+
+class VpL0FcFilter : public VpFilter
+{
+public:
+    VpL0FcFilter(PVP_MHWINTERFACE vpMhwInterface);
+
+    ~VpL0FcFilter()
+    {
+        Destroy();
+    };
+
+    virtual MOS_STATUS Init() override;
+
+    virtual MOS_STATUS Prepare() override;
+
+    virtual MOS_STATUS Destroy() override;
+
+    virtual MOS_STATUS SetExecuteEngineCaps(
+        SwFilterPipe   *executingPipe,
+        VP_EXECUTE_CAPS vpExecuteCaps);
+
+    MOS_STATUS        CalculateEngineParams();
+    PRENDER_L0_FC_PARAMS GetFcParams()
+    {
+        return m_renderL0FcParams;
+    }
+
+protected:
+    MOS_STATUS InitCompParams(L0_FC_KERNEL_PARAMS &compParams, SwFilterPipe &executingPipe);
+    MOS_STATUS AddScalingKrn(SwFilterScaling *scaling, SurfaceType inputSurf, SurfaceType outputSurf, L0_FC_KERNEL_PARAM &param);
+
+    SwFilterPipe        *m_executingPipe    = nullptr;
+    PRENDER_L0_FC_PARAMS m_renderL0FcParams = nullptr;
+
+    KERNEL_INDEX_ARG_MAP m_scalingKrnArgs;
+
+MEDIA_CLASS_DEFINE_END(vp__VpL0FcFilter)
+};
+
+struct HW_FILTER_L0_FC_PARAM : public HW_FILTER_PARAM
+{
+    SwFilterPipe *executingPipe;
+};
+
+class HwFilterL0FcParameter : public HwFilterParameter
+{
+public:
+    static HwFilterParameter *Create(HW_FILTER_L0_FC_PARAM &param, FeatureType featureType);
+    HwFilterL0FcParameter(FeatureType featureType);
+    virtual ~HwFilterL0FcParameter();
+    virtual MOS_STATUS ConfigParams(HwFilter &hwFilter);
+
+    MOS_STATUS Initialize(HW_FILTER_L0_FC_PARAM &param);
+
+private:
+    HW_FILTER_L0_FC_PARAM m_Params = {};
+
+MEDIA_CLASS_DEFINE_END(vp__HwFilterL0FcParameter)
+};
+
+class VpRenderL0FcParameter : public VpPacketParameter
+{
+public:
+    static VpPacketParameter *Create(HW_FILTER_L0_FC_PARAM &param);
+    VpRenderL0FcParameter(PVP_MHWINTERFACE pHwInterface, PacketParamFactoryBase *packetParamFactory);
+    virtual ~VpRenderL0FcParameter();
+
+    virtual bool SetPacketParam(VpCmdPacket *pPacket);
+
+private:
+    MOS_STATUS Initialize(HW_FILTER_L0_FC_PARAM &params);
+
+    VpL0FcFilter m_fcFilter;
+
+MEDIA_CLASS_DEFINE_END(vp__VpRenderL0FcParameter)
+};
+
+class PolicyL0FcFeatureHandler : public PolicyFeatureHandler
+{
+public:
+    PolicyL0FcFeatureHandler(VP_HW_CAPS &hwCaps) : PolicyFeatureHandler(hwCaps)
+    {
+        m_Type = FeatureTypeFc;
+    }
+    virtual ~PolicyL0FcFeatureHandler()
+    {
+    }
+    virtual bool IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps)
+    {
+        // Not create hwFilters for single FC features.
+        return false;
+    }
+    virtual HwFilterParameter *CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe &swFilterPipe, PVP_MHWINTERFACE pHwInterface)
+    {
+        return nullptr;
+    }
+    virtual MOS_STATUS        UpdateFeaturePipe(VP_EXECUTE_CAPS caps, SwFilter &feature, SwFilterPipe &featurePipe, SwFilterPipe &executePipe, bool isInputPipe, int index);
+    static VpPacketParameter *CreatePacketParam(HW_FILTER_PARAM &param)
+    {
+        return nullptr;
+    }
+    virtual MOS_STATUS UpdateUnusedFeature(VP_EXECUTE_CAPS caps, SwFilter &feature, SwFilterPipe &featurePipe, SwFilterPipe &executePipe, bool isInputPipe, int index);
+
+MEDIA_CLASS_DEFINE_END(vp__PolicyL0FcFeatureHandler)
+};
+
+class PolicyL0FcHandler : public PolicyFeatureHandler
+{
+public:
+    PolicyL0FcHandler(VP_HW_CAPS &hwCaps);
+    virtual ~PolicyL0FcHandler();
+    virtual bool               IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps);
+    virtual HwFilterParameter *CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe &swFilterPipe, PVP_MHWINTERFACE pHwInterface);
+    virtual MOS_STATUS         UpdateFeaturePipe(VP_EXECUTE_CAPS caps, SwFilter &feature, SwFilterPipe &featurePipe, SwFilterPipe &executePipe, bool isInputPipe, int index);
+    static VpPacketParameter  *CreatePacketParam(HW_FILTER_PARAM &param)
+    {
+        if (param.type != FeatureTypeFcOnRender)
+        {
+            VP_PUBLIC_ASSERTMESSAGE("Invalid parameter for FC!");
+            return nullptr;
+        }
+
+        HW_FILTER_L0_FC_PARAM *fcParam = (HW_FILTER_L0_FC_PARAM *)(&param);
+        return VpRenderL0FcParameter::Create(*fcParam);
+    }
+
+    virtual MOS_STATUS LayerSelectForProcess(std::vector<int> &layerIndexes, SwFilterPipe &featurePipe, VP_EXECUTE_CAPS &caps);
+
+private:
+    MOS_STATUS         RemoveTransparentLayers(SwFilterPipe &featurePipe);
+    virtual MOS_STATUS AddInputLayerForProcess(bool &bSkip, std::vector<int> &layerIndexes, VPHAL_SCALING_MODE &scalingMode, int index, VP_SURFACE &input, SwFilterSubPipe &pipe, VP_SURFACE &output, VP_EXECUTE_CAPS &caps);
+
+    PacketParamFactory<VpRenderL0FcParameter> m_PacketParamFactory;
+
+    // Resource counters
+    struct
+    {
+        int32_t layers;
+        int32_t palettes;
+        int32_t avs;
+        int32_t procamp;
+        int32_t lumaKeys;
+        int32_t sampler;
+
+        void Reset(bool isAvsSamplerSupported)
+        {
+            // Next step to init it from hw caps object.
+            layers   = VP_COMP_MAX_LAYERS;
+            palettes = VP_COMP_MAX_PALETTES;
+            procamp  = VP_COMP_MAX_PROCAMP;
+            lumaKeys = VP_COMP_MAX_LUMA_KEY;
+            avs      = isAvsSamplerSupported ? VP_COMP_MAX_AVS : 0;
+            sampler  = VP_COMP_MAX_SAMPLER;
+        }
+    } m_resCounter = {};
+
+MEDIA_CLASS_DEFINE_END(vp__PolicyL0FcHandler)
+};
+
+}
+
+#endif
\ No newline at end of file
diff --git a/media_softlet/agnostic/common/vp/hal/features/vp_scaling_filter.cpp b/media_softlet/agnostic/common/vp/hal/features/vp_scaling_filter.cpp
index 069ac43..69a5fa2 100644
--- a/media_softlet/agnostic/common/vp/hal/features/vp_scaling_filter.cpp
+++ b/media_softlet/agnostic/common/vp/hal/features/vp_scaling_filter.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2018-2023, Intel Corporation
+* Copyright (c) 2018-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -37,7 +37,7 @@
 
 namespace vp
 {
-MOS_FORMAT GetSfcInputFormat(VP_EXECUTE_CAPS &executeCaps, MOS_FORMAT inputFormat, VPHAL_CSPACE colorSpaceOutput);
+MOS_FORMAT GetSfcInputFormat(VP_EXECUTE_CAPS &executeCaps, MOS_FORMAT inputFormat, VPHAL_CSPACE colorSpaceOutput, MOS_FORMAT outputFormat);
 };
 
 VpScalingFilter::VpScalingFilter(
@@ -183,34 +183,54 @@
     VP_PUBLIC_NORMALMESSAGE("isColorfillEnable %d", m_bColorfillEnable);
 
     if (m_bColorfillEnable)
-    {
-        VP_PUBLIC_CHK_NULL_RETURN(m_scalingParams.pColorFillParams);
-        Src.dwValue = m_scalingParams.pColorFillParams->Color;
-        src_cspace  = m_scalingParams.pColorFillParams->CSpace;
-        dst_cspace  = m_scalingParams.csc.colorSpaceOutput;
-
-        // Convert BG color only if not done so before. CSC is expensive!
-        if ((m_colorFillColorSrc.dwValue != Src.dwValue) ||
-            (m_colorFillSrcCspace != src_cspace)         ||
-            (m_colorFillRTCspace  != dst_cspace))
+    {   // for fp16 output format, if the colorfill params space is RGB, passed the float value of ARGB channels from DDI to mhw directly, no need convert.
+        if (IS_RGB_CSPACE(m_scalingParams.pColorFillParams->CSpace) && (IS_RGB64_FLOAT_FORMAT(m_scalingParams.formatOutput)))
         {
-            VP_PUBLIC_NORMALMESSAGE("colorFillColorDst need be recalculated.");
-            // Clean history Dst BG Color if hit unsupported format
-            if (!VpUtils::GetCscMatrixForRender8Bit(&m_colorFillColorDst, &Src, src_cspace, dst_cspace))
+            // Swap the channel here because HW only natively supports XBGR output
+            if (m_scalingParams.formatOutput == Format_A16B16G16R16F)
             {
-                VP_PUBLIC_NORMALMESSAGE("VpUtils::GetCscMatrixForRender8Bit failed!");
-                MOS_ZeroMemory(&m_colorFillColorDst, sizeof(m_colorFillColorDst));
+                m_sfcScalingParams->sfcColorfillParams.fColorFillYRPixel = m_scalingParams.pColorFillParams->Color1.B;
+                m_sfcScalingParams->sfcColorfillParams.fColorFillUGPixel = m_scalingParams.pColorFillParams->Color1.G;
+                m_sfcScalingParams->sfcColorfillParams.fColorFillVBPixel = m_scalingParams.pColorFillParams->Color1.R;
             }
-            // store the values for next iteration
-            m_colorFillColorSrc  = Src;
-            m_colorFillSrcCspace = src_cspace;
-            m_colorFillRTCspace  = dst_cspace;
+            else
+            {
+                m_sfcScalingParams->sfcColorfillParams.fColorFillYRPixel = m_scalingParams.pColorFillParams->Color1.R;
+                m_sfcScalingParams->sfcColorfillParams.fColorFillUGPixel = m_scalingParams.pColorFillParams->Color1.G;
+                m_sfcScalingParams->sfcColorfillParams.fColorFillVBPixel = m_scalingParams.pColorFillParams->Color1.B;
+            }
+            m_sfcScalingParams->sfcColorfillParams.fColorFillAPixel = m_scalingParams.pColorFillParams->Color1.A;
         }
+        else
+        {
+            VP_PUBLIC_CHK_NULL_RETURN(m_scalingParams.pColorFillParams);
+            Src.dwValue = m_scalingParams.pColorFillParams->Color;
+            src_cspace  = m_scalingParams.pColorFillParams->CSpace;
+            dst_cspace  = m_scalingParams.csc.colorSpaceOutput;
 
-        VP_PUBLIC_NORMALMESSAGE("colorFillSrc %x, src_cspace %d, colorFillDst %x, dst_cspace %d", Src.dwValue, src_cspace, m_colorFillColorDst.dwValue, dst_cspace);
+            // Convert BG color only if not done so before. CSC is expensive!
+            if ((m_colorFillColorSrc.dwValue != Src.dwValue) ||
+                (m_colorFillSrcCspace != src_cspace) ||
+                (m_colorFillRTCspace != dst_cspace))
+            {
+                VP_PUBLIC_NORMALMESSAGE("colorFillColorDst need be recalculated.");
+                // Clean history Dst BG Color if hit unsupported format
+                if (!VpUtils::GetCscMatrixForRender8Bit(&m_colorFillColorDst, &Src, src_cspace, dst_cspace))
+                {
+                    VP_PUBLIC_NORMALMESSAGE("VpUtils::GetCscMatrixForRender8Bit failed!");
+                    MOS_ZeroMemory(&m_colorFillColorDst, sizeof(m_colorFillColorDst));
+                }
+                // store the values for next iteration
+                m_colorFillColorSrc  = Src;
+                m_colorFillSrcCspace = src_cspace;
+                m_colorFillRTCspace  = dst_cspace;
+            }
 
-        VP_RENDER_CHK_STATUS_RETURN(SetYUVRGBPixel());
-        m_sfcScalingParams->sfcColorfillParams.fColorFillAPixel = (float)Src.A / 255.0F;
+            VP_PUBLIC_NORMALMESSAGE("colorFillSrc %x, src_cspace %d, colorFillDst %x, dst_cspace %d", Src.dwValue, src_cspace, m_colorFillColorDst.dwValue, dst_cspace);
+
+            VP_RENDER_CHK_STATUS_RETURN(SetYUVRGBPixel());
+            m_sfcScalingParams->sfcColorfillParams.fColorFillAPixel = (float)Src.A / 255.0F;
+        }
     }
 
     if (m_scalingParams.pCompAlpha)
@@ -243,7 +263,8 @@
         if ((m_scalingParams.formatOutput == Format_A8R8G8B8)       ||
             (m_scalingParams.formatOutput == Format_X8R8G8B8)       ||
             (m_scalingParams.formatOutput == Format_R10G10B10A2)    ||
-            (m_scalingParams.formatOutput == Format_A16R16G16B16))
+            (m_scalingParams.formatOutput == Format_A16B16G16R16)   ||
+            (m_scalingParams.formatOutput == Format_A16B16G16R16F))
         {
             m_sfcScalingParams->sfcColorfillParams.fColorFillYRPixel = (float)m_colorFillColorDst.B / 255.0F;
             m_sfcScalingParams->sfcColorfillParams.fColorFillUGPixel = (float)m_colorFillColorDst.G / 255.0F;
@@ -510,7 +531,8 @@
 
         m_scalingParams.formatInput             = GetSfcInputFormat(m_executeCaps,
                                                                     m_scalingParams.formatInput,
-                                                                    m_scalingParams.csc.colorSpaceOutput);
+                                                                    m_scalingParams.csc.colorSpaceOutput,
+                                                                    m_scalingParams.formatOutput);
         m_sfcScalingParams->inputFrameFormat    = m_scalingParams.formatInput;
         m_sfcScalingParams->dwInputFrameHeight  = dwSurfaceHeight;
         m_sfcScalingParams->dwInputFrameWidth   = dwSurfaceWidth;
@@ -612,6 +634,7 @@
         m_sfcScalingParams->interlacedScalingType = m_scalingParams.interlacedScalingType;
         m_sfcScalingParams->srcSampleType         = m_scalingParams.input.sampleType;
         m_sfcScalingParams->dstSampleType         = m_scalingParams.output.sampleType;
+        m_sfcScalingParams->isDemosaicNeeded      = m_executeCaps.bDemosaicInUse;
 
         VP_RENDER_CHK_STATUS_RETURN(SetColorFillParams());
     }
@@ -895,6 +918,13 @@
         params2ndPass.input.rcSrc = params1stPass.input.rcDst;
         params2ndPass.input.rcMaxSrc = params2ndPass.input.rcSrc;
 
+        if (params2ndPass.interlacedScalingType == ISCALING_INTERLEAVED_TO_FIELD)
+        {
+            params2ndPass.input.dwHeight = params2ndPass.input.dwHeight / 2;
+            params2ndPass.input.rcSrc.bottom = params2ndPass.input.rcSrc.bottom / 2;
+            params2ndPass.input.rcMaxSrc.bottom = params2ndPass.input.rcMaxSrc.bottom / 2;
+        }
+
         // Set engine caps for filter in 2nd pass.
         filter2ndPass->SetFeatureType(FeatureTypeScaling);
         filter2ndPass->GetFilterEngineCaps().value = 0;
diff --git a/media_softlet/agnostic/common/vp/hal/packet/media_srcs.cmake b/media_softlet/agnostic/common/vp/hal/packet/media_srcs.cmake
index 34139ed..0a4b36a 100644
--- a/media_softlet/agnostic/common/vp/hal/packet/media_srcs.cmake
+++ b/media_softlet/agnostic/common/vp/hal/packet/media_srcs.cmake
@@ -32,6 +32,9 @@
     ${CMAKE_CURRENT_LIST_DIR}/vp_render_vebox_hdr_3dlut_kernel.cpp
     ${CMAKE_CURRENT_LIST_DIR}/vp_render_vebox_hvs_kernel.cpp
     ${CMAKE_CURRENT_LIST_DIR}/vp_render_hdr_kernel.cpp
+    ${CMAKE_CURRENT_LIST_DIR}/vp_render_l0_fc_kernel.cpp
+    ${CMAKE_CURRENT_LIST_DIR}/vp_render_vebox_hdr_3dlut_l0_kernel.cpp
+    ${CMAKE_CURRENT_LIST_DIR}/vp_frametracker.cpp
 )
 
 set(TMP_HEADERS_
@@ -53,6 +56,9 @@
     ${CMAKE_CURRENT_LIST_DIR}/vp_render_vebox_hdr_3dlut_kernel.h
     ${CMAKE_CURRENT_LIST_DIR}/vp_render_vebox_hvs_kernel.h
     ${CMAKE_CURRENT_LIST_DIR}/vp_render_hdr_kernel.h
+    ${CMAKE_CURRENT_LIST_DIR}/vp_render_l0_fc_kernel.h
+    ${CMAKE_CURRENT_LIST_DIR}/vp_render_vebox_hdr_3dlut_l0_kernel.h
+    ${CMAKE_CURRENT_LIST_DIR}/vp_frametracker.h
 )
 
 set(SOFTLET_VP_SOURCES_
@@ -71,4 +77,4 @@
 set (SOFTLET_VP_PRIVATE_INCLUDE_DIRS_
     ${SOFTLET_VP_PRIVATE_INCLUDE_DIRS_}
     ${CMAKE_CURRENT_LIST_DIR}
-)
\ No newline at end of file
+)
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_frametracker.cpp b/media_softlet/agnostic/common/vp/hal/packet/vp_frametracker.cpp
new file mode 100644
index 0000000..e829bab
--- /dev/null
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_frametracker.cpp
@@ -0,0 +1,78 @@
+/*
+* Copyright (c) 2024, Intel Corporation
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*/
+//!
+//! \file     vp_frametracker.cpp
+//! \brief    vp frame tracker.
+//! \details  vp frame tracker.
+//!
+#include "vp_frametracker.h"
+using namespace vp;
+
+VpFrameTracker::VpFrameTracker() : m_numberOfFrames(0), m_startTimeQueue({}), m_isEnabled(false)
+{
+}
+
+MOS_STATUS VpFrameTracker::UpdateFPS()
+{
+    if (m_isEnabled)
+    {
+        m_numberOfFrames++;
+        if (m_numberOfFrames > FRAME_TRACING_BEGIN)
+        {
+            if (m_startTimeQueue.size() <= FRAME_TRACING_PERIOD)
+            {
+                m_startTimeQueue.push_back(Clock::now());
+            }
+            else
+            {
+                m_startTimeQueue.pop_front();
+                m_startTimeQueue.push_back(Clock::now());
+                m_numberOfFrames = MAX_FRAME_TRACING;
+            }
+        }
+    }
+    return MOS_STATUS_SUCCESS;
+}
+
+bool VpFrameTracker::Is60Fps()
+{
+    // Only be calculated with isEnabled flag has been set
+    // Skip first FRAME_TRACING_BEGIN frames to avoid noise
+    // Calculate the FPS during FRAME_TRACING_PERIOD
+    // If the FPS is greater than FPS60_THRESHOLD, return true
+    m_isEnabled = true;
+    bool res         = false;
+
+    if (m_numberOfFrames >= MAX_FRAME_TRACING)
+    {
+        double currFPS = GetFPS();
+        if (currFPS > FPS60_THRESHOLD)
+        {
+            res = true;
+        }
+        else
+        {
+            res = false;
+        }
+    }
+    return res;
+}
\ No newline at end of file
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_frametracker.h b/media_softlet/agnostic/common/vp/hal/packet/vp_frametracker.h
new file mode 100644
index 0000000..722610c
--- /dev/null
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_frametracker.h
@@ -0,0 +1,81 @@
+/*
+* Copyright (c) 2024, Intel Corporation
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+//!
+//! \file     vp_frametracker.h
+//! \brief    vp frame tracker.
+//!
+#ifndef __VP_FRAMETRACKER_H__
+#define __VP_FRAMETRACKER_H__
+#include <chrono>
+#include <stack>
+#include "mos_defs.h"
+#include "vp_utils.h"
+
+namespace vp
+{
+using Clock = std::chrono::high_resolution_clock;
+using TimePoint = Clock::time_point;
+
+#define FRAME_TRACING_BEGIN 2 //Skip first 2 frames. Tuning the value can change skipped frame
+#define FRAME_TRACING_PERIOD 5 //Calbrate FPS with 5 frames, can enlarge/decrease calculation window
+#define MAX_FRAME_TRACING (FRAME_TRACING_BEGIN + FRAME_TRACING_PERIOD + 1)
+#define FPS60_THRESHOLD 33 // 60FPS threshold. Can tune this value according to different senario
+
+class VpFrameTracker
+{
+public:
+    VpFrameTracker();
+
+    virtual ~VpFrameTracker()
+    {
+        m_startTimeQueue.clear();
+    };
+
+    virtual MOS_STATUS UpdateFPS();
+
+    virtual bool Is60Fps();
+
+    double GetFPS()
+    {
+        std::chrono::duration<double> elapsed = m_startTimeQueue.back() - m_startTimeQueue.front();
+
+        if (m_startTimeQueue.size() != (FRAME_TRACING_PERIOD + 1))
+        {
+            VP_RENDER_ASSERTMESSAGE("Frame tracker queue size is not correct!");
+            VP_RENDER_ASSERT(m_startTimeQueue.size() == (FRAME_TRACING_PERIOD + 1));
+        }
+
+        return ((1.0 / elapsed.count()) * FRAME_TRACING_PERIOD);
+    }
+
+protected:
+
+    int                   m_numberOfFrames;
+    std::deque<TimePoint> m_startTimeQueue;
+    bool                  m_isEnabled = false;
+
+MEDIA_CLASS_DEFINE_END(vp__VpFrameTracker)
+};
+
+}  // namespace vp
+#endif  // !__VP_FRAMETRACKER_H__
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_packet_shared_context.h b/media_softlet/agnostic/common/vp/hal/packet/vp_packet_shared_context.h
index 0edb30d..05cb867 100644
--- a/media_softlet/agnostic/common/vp/hal/packet/vp_packet_shared_context.h
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_packet_shared_context.h
@@ -32,6 +32,8 @@
     {
         bool     bTgneFirstFrame            = true;
         bool     bTgneEnable                = false;
+        bool     previousFallback           = false;
+        uint32_t tgneFrame                  = 0;
         uint32_t lumaStadTh                 = 3200;
         uint32_t chromaStadTh               = 1600;
         uint32_t dw4X4TGNEThCnt             = 576;
@@ -40,6 +42,9 @@
         uint32_t globalNoiseLevel_Temporal  = 0;  //!< Global Temporal Noise Level for Y
         uint32_t globalNoiseLevelU_Temporal = 0;  //!< Global Temporal Noise Level for U
         uint32_t globalNoiseLevelV_Temporal = 0;  //!< Global Temporal Noise Level for V
+        uint32_t globalNoiseLevel_Spatial   = 0;  //!< Global Spatial Noise Level for Y
+        uint32_t globalNoiseLevelU_Spatial  = 0;  //!< Global Spatial Noise Level for U
+        uint32_t globalNoiseLevelV_Spatial  = 0;  //!< Global Spatial Noise Level for V
     } tgneParams;
 
     struct
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 98e5f35..6aad76c 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
@@ -24,6 +24,8 @@
 //! \brief    render packet which used in by mediapipline.
 //! \details  render packet provide the structures and generate the cmd buffer which mediapipline will used.
 //!
+#include <iomanip>
+
 #include "vp_render_cmd_packet.h"
 #include "vp_platform_interface.h"
 #include "vp_pipeline_common.h"
@@ -150,6 +152,25 @@
     return MOS_STATUS_SUCCESS;
 }
 
+MOS_STATUS VpRenderCmdPacket::SetEuThreadSchedulingMode(uint32_t mode)
+{
+    VP_FUNC_CALL();
+    VP_RENDER_CHK_NULL_RETURN(m_renderHal);
+    uint32_t curMode = m_renderHal->euThreadSchedulingMode;
+    if (curMode != mode)
+    {
+        if (curMode != 0)
+        {
+            RENDER_PACKET_ASSERTMESSAGE("Not support different modes in same kernelObjs!");
+        }
+        else
+        {
+            m_renderHal->euThreadSchedulingMode = mode;
+        }
+    }
+    return MOS_STATUS_SUCCESS;
+}
+
 MOS_STATUS VpRenderCmdPacket::Prepare()
 {
     VP_FUNC_CALL();
@@ -182,6 +203,8 @@
         return MOS_STATUS_SUCCESS;
     }
 
+    m_renderHal->euThreadSchedulingMode = 0;
+
     VP_RENDER_CHK_STATUS_RETURN(m_kernelSet->CreateKernelObjects(
         m_renderKernelParams,
         m_surfSetting.surfGroup,
@@ -227,6 +250,7 @@
             VP_RENDER_CHK_NULL_RETURN(m_kernel);
 
             m_kernel->SetCacheCntl(m_surfMemCacheCtl);
+            VP_RENDER_CHK_STATUS_RETURN(SetEuThreadSchedulingMode(m_kernel->GetEuThreadSchedulingMode()));
 
             // reset render Data for current kernel
             MOS_ZeroMemory(&m_renderData, sizeof(KERNEL_PACKET_RENDER_DATA));
@@ -305,6 +329,8 @@
             m_kernel = it->second;
             VP_RENDER_CHK_NULL_RETURN(m_kernel);
             m_kernel->SetPerfTag();
+            VP_RENDER_CHK_STATUS_RETURN(SetEuThreadSchedulingMode(m_kernel->GetEuThreadSchedulingMode()));
+
             if (it != m_kernelObjs.begin())
             {
                 // reset render Data for current kernel
@@ -357,7 +383,8 @@
     KERNEL_SAMPLER_STATES samplerStates = {};
 
     // For AdvKernel, SetSamplerStates is called by VpRenderKernelObj::SetKernelConfigs
-    if (!m_kernel->IsAdvKernel())
+    // For some AdvKernels, when UseIndependentSamplerGroup is true, each kernel in one media state submission uses a stand alone sampler state group
+    if (!m_kernel->IsAdvKernel() || m_kernel->UseIndependentSamplerGroup())
     {
         // Initialize m_kernelSamplerStateGroup.
         VP_RENDER_CHK_STATUS_RETURN(m_kernel->SetSamplerStates(m_kernelSamplerStateGroup));
@@ -802,6 +829,12 @@
         }
         VP_RENDER_CHK_STATUS_RETURN(m_kernel->UpdateCompParams());
     }
+    else
+    {
+        // Reset status
+        m_renderHal->bCmfcCoeffUpdate  = false;
+        m_renderHal->pCmfcCoeffSurface = nullptr;
+    }
 
     return MOS_STATUS_SUCCESS;
 }
@@ -1767,6 +1800,48 @@
     return MOS_STATUS_SUCCESS;
 }
 
+void VpRenderCmdPacket::PrintWalkerParas(MHW_GPGPU_WALKER_PARAMS& WalkerParams)
+{
+#if (_DEBUG || _RELEASE_INTERNAL)
+    std::string inlineData = "";
+    if (WalkerParams.inlineDataLength > 0 && WalkerParams.inlineData != nullptr)
+    {
+        for (uint32_t i = 0; i < WalkerParams.inlineDataLength; ++i)
+        {
+            uint8_t iData = WalkerParams.inlineData[i];
+            std::stringstream hex;
+            hex << "0x" << std::hex << std::setfill('0') << std::setw(2) << static_cast<int>(iData) << " ";
+            inlineData += hex.str();
+        }
+    }
+    VP_RENDER_VERBOSEMESSAGE("GpGPU WalkerParams: InterfaceDescriptorOffset = %x, GpGpuEnable = %d, IndirectDataLength = %d, IndirectDataStartAddress = %x, BindingTableID %d, ForcePreferredSLMZero %d",
+        WalkerParams.InterfaceDescriptorOffset,
+        WalkerParams.GpGpuEnable,
+        WalkerParams.IndirectDataLength,
+        WalkerParams.IndirectDataStartAddress,
+        WalkerParams.BindingTableID,
+        WalkerParams.ForcePreferredSLMZero);
+    VP_RENDER_VERBOSEMESSAGE("GpGPU WalkerParams: ThreadWidth = %d, ThreadHeight = %d, ThreadDepth = %d, GroupWidth = %d, GroupHeight = %d, GroupDepth = %d, GroupStartingX = %d, GroupStartingY = %d, GroupStartingZ = %d, SLMSize %d",
+        WalkerParams.ThreadWidth,
+        WalkerParams.ThreadHeight,
+        WalkerParams.ThreadDepth,
+        WalkerParams.GroupWidth,
+        WalkerParams.GroupHeight,
+        WalkerParams.GroupDepth,
+        WalkerParams.GroupStartingX,
+        WalkerParams.GroupStartingY,
+        WalkerParams.GroupStartingZ,
+        WalkerParams.SLMSize);
+    VP_RENDER_VERBOSEMESSAGE("GpGPU WalkerParams: GenerateLocalId %d, EmitLocal %d, EmitInlineParameter %d",
+        WalkerParams.isGenerateLocalID,
+        WalkerParams.emitLocal,
+        WalkerParams.isEmitInlineParameter);
+    VP_RENDER_VERBOSEMESSAGE("GpGPU WalkerParams: InlineDataLength = %d, InlineData = %s",
+        WalkerParams.inlineDataLength,
+        inlineData.c_str());
+#endif
+}
+
 void VpRenderCmdPacket::PrintWalkerParas(MHW_WALKER_PARAMS &WalkerParams)
 {
 #if (_DEBUG || _RELEASE_INTERNAL)
@@ -1911,6 +1986,15 @@
             pipeCtlParams.dwFlushMode             = MHW_FLUSH_CUSTOM;
             pipeCtlParams.bInvalidateTextureCache = true;
             pipeCtlParams.bFlushRenderTargetCache = true;
+
+            if (it->second.walkerParam.pipeControlParams.bUpdateNeeded)
+            {
+                pipeCtlParams.bHdcPipelineFlush = it->second.walkerParam.pipeControlParams.bEnableDataPortFlush;
+                pipeCtlParams.bUnTypedDataPortCacheFlush = it->second.walkerParam.pipeControlParams.bUnTypedDataPortCacheFlush;
+                pipeCtlParams.bFlushRenderTargetCache = it->second.walkerParam.pipeControlParams.bFlushRenderTargetCache;
+                pipeCtlParams.bInvalidateTextureCache = it->second.walkerParam.pipeControlParams.bInvalidateTextureCache;
+            }
+
             if (flushL1)
             {   //Flush L1 cache after consumer walker when there is a producer-consumer relationship walker.
                 pipeCtlParams.bUnTypedDataPortCacheFlush = true;
@@ -1957,7 +2041,7 @@
                 &m_gpgpuWalkerParams));
 
             flushL1 = it->second.walkerParam.bFlushL1;
-            PrintWalkerParas(m_mediaWalkerParams);
+            PrintWalkerParas(m_gpgpuWalkerParams);
         }
         else
         {
@@ -1977,13 +2061,6 @@
     return eStatus;
 }
 
-MOS_STATUS VpRenderCmdPacket::SetDiFmdParams(PRENDER_DI_FMD_PARAMS params)
-{
-    VP_FUNC_CALL();
-
-    return MOS_STATUS_SUCCESS;
-}
-
 MOS_STATUS VpRenderCmdPacket::SetFcParams(PRENDER_FC_PARAMS params)
 {
     VP_FUNC_CALL();
@@ -1999,6 +2076,31 @@
     return MOS_STATUS_SUCCESS;
 }
 
+MOS_STATUS VpRenderCmdPacket::SetL0FcParams(PRENDER_L0_FC_PARAMS params)
+{
+    VP_FUNC_CALL();
+    VP_RENDER_CHK_NULL_RETURN(params);
+
+    KERNEL_PARAMS kernelParam = {};
+    for (auto &krnParams : params->fc_kernelParams)
+    {
+        kernelParam.kernelId                       = krnParams.kernelId;
+        kernelParam.kernelArgs                     = krnParams.kernelArgs;
+        kernelParam.kernelThreadSpace.uWidth       = krnParams.threadWidth;
+        kernelParam.kernelThreadSpace.uHeight      = krnParams.threadHeight;
+        kernelParam.kernelThreadSpace.uLocalWidth  = krnParams.localWidth;
+        kernelParam.kernelThreadSpace.uLocalHeight = krnParams.localHeight;
+        kernelParam.syncFlag                       = true;
+
+        m_renderKernelParams.push_back(kernelParam);
+    }
+
+    m_submissionMode            = MULTI_KERNELS_SINGLE_MEDIA_STATE;
+    m_isMultiBindingTables      = true;
+    m_isLargeSurfaceStateNeeded = true;
+    return MOS_STATUS_SUCCESS;
+}
+
 MOS_STATUS VpRenderCmdPacket::SetHdr3DLutParams(
     PRENDER_HDR_3DLUT_CAL_PARAMS params)
 {
@@ -2013,6 +2115,8 @@
     // kernel.GetKernelArgs().
     kernelParams.kernelThreadSpace.uWidth = params->threadWidth;
     kernelParams.kernelThreadSpace.uHeight = params->threadHeight;
+    kernelParams.kernelThreadSpace.uLocalWidth = params->localWidth;
+    kernelParams.kernelThreadSpace.uLocalHeight = params->localHeight;
     kernelParams.kernelArgs = params->kernelArgs;
     kernelParams.syncFlag = true;
     m_renderKernelParams.push_back(kernelParams);
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_render_cmd_packet.h b/media_softlet/agnostic/common/vp/hal/packet/vp_render_cmd_packet.h
index e68fde6..c069bbd 100644
--- a/media_softlet/agnostic/common/vp/hal/packet/vp_render_cmd_packet.h
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_render_cmd_packet.h
@@ -48,6 +48,8 @@
         return RenderCmdPacket::Destroy();
     }
 
+    MOS_STATUS SetEuThreadSchedulingMode(uint32_t mode);
+
     virtual MOS_STATUS Submit(MOS_COMMAND_BUFFER* commandBuffer, uint8_t packetPhase = otherPacket) override;
 
     virtual MOS_STATUS SubmitWithMultiKernel(MOS_COMMAND_BUFFER* commandBuffer, uint8_t packetPhase = otherPacket);
@@ -59,10 +61,10 @@
         VP_SURFACE_SETTING& surfSetting,
         VP_EXECUTE_CAPS packetCaps) override;
 
-    virtual MOS_STATUS SetDiFmdParams(PRENDER_DI_FMD_PARAMS params);
-
     virtual MOS_STATUS SetFcParams(PRENDER_FC_PARAMS params);
 
+    virtual MOS_STATUS SetL0FcParams(PRENDER_L0_FC_PARAMS params);
+
     virtual MOS_STATUS SetHdr3DLutParams(PRENDER_HDR_3DLUT_CAL_PARAMS params);
 
     virtual MOS_STATUS SetDnHVSParams(PRENDER_DN_HVS_CAL_PARAMS params);
@@ -70,6 +72,7 @@
     virtual MOS_STATUS DumpOutput() override;
 
     void PrintWalkerParas(MHW_WALKER_PARAMS &WalkerParams);
+    void PrintWalkerParas(MHW_GPGPU_WALKER_PARAMS &WalkerParams);
 
     virtual MOS_STATUS SetHdrParams(PRENDER_HDR_PARAMS params);
     virtual bool IsRenderUncompressedWriteNeeded(PVP_SURFACE VpSurface);
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_render_common.h b/media_softlet/agnostic/common/vp/hal/packet/vp_render_common.h
index 96c321d..24a89ae 100644
--- a/media_softlet/agnostic/common/vp/hal/packet/vp_render_common.h
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_render_common.h
@@ -44,6 +44,8 @@
 {
     uint32_t uWidth;
     uint32_t uHeight;
+    uint32_t uLocalWidth;
+    uint32_t uLocalHeight;
 };
 
 // Need to consistant with compiler
@@ -64,7 +66,18 @@
     ARG_KIND_IMPLICIT_LOCALID       = 0x10,
     ARG_KIND_GENERAL_DEPVEC         = 0x20,
     ARG_KIND_SURFACE_2D_SCOREBOARD  = 0x2A,
-    ARG_KIND_GENERAL_DEPCNT         = 0x30
+    ARG_KIND_GENERAL_DEPCNT         = 0x30,
+
+    //For L0 used only
+    ARG_KIND_INLINE                 = 0xa00
+};
+
+enum KRN_ARG_ADDRESSMODE
+{
+    AddressingModeStateful = 0,
+    AddressingModeStateless,
+    AddressingModeBindless,
+    AddressIngModeMax
 };
 
 struct KRN_ARG
@@ -75,6 +88,7 @@
     uint32_t               uSize;            // size of arg in byte
     KRN_ARG_KIND           eArgKind;
     bool                   isOutput;
+    KRN_ARG_ADDRESSMODE    addressMode;
 };
 
 //for L0 use only
@@ -99,6 +113,9 @@
     uint32_t uEuThreadCount;
     bool     bHasFenceForImageAccess;
     bool     bHasSample;
+    bool     bHas4GBBuffers;
+    uint8_t  uiWorkGroupWalkOrderDimensions[3];
+    uint64_t uiPrivateSize;
 };
 
 using SurfaceIndex = uint32_t;
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_render_fc_kernel.cpp b/media_softlet/agnostic/common/vp/hal/packet/vp_render_fc_kernel.cpp
index f8308fe..87ce525 100644
--- a/media_softlet/agnostic/common/vp/hal/packet/vp_render_fc_kernel.cpp
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_render_fc_kernel.cpp
@@ -598,9 +598,16 @@
 
     VP_RENDER_CHK_STATUS_RETURN(osInterface->pfnGetMemoryCompressionMode(osInterface,
         &src->surf->osSurface->OsResource, &renderHalSurface->OsSurface.MmcState));
-
-    VP_RENDER_CHK_STATUS_RETURN(osInterface->pfnGetMemoryCompressionFormat(osInterface,
-        &src->surf->osSurface->OsResource, &renderHalSurface->OsSurface.CompressionFormat));
+    
+    if (m_hwInterface->m_waTable && MEDIA_IS_WA(m_hwInterface->m_waTable, Wa_16023363837))
+    {
+        VP_RENDER_CHK_STATUS_RETURN(InitRenderHalSurfaceCMF(src->surf->osSurface, renderHalSurface));
+    }
+    else
+    {
+        VP_RENDER_CHK_STATUS_RETURN(osInterface->pfnGetMemoryCompressionFormat(osInterface,
+            &src->surf->osSurface->OsResource, &renderHalSurface->OsSurface.CompressionFormat));
+    }
 
     renderHalSurface->rcSrc                        = src->surf->rcSrc;
     renderHalSurface->rcDst                        = src->surf->rcDst;
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 65dc06b..f9eab14 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
@@ -3268,8 +3268,15 @@
     VP_RENDER_CHK_STATUS_RETURN(osInterface->pfnGetMemoryCompressionMode(osInterface,
         &surf->osSurface->OsResource, &renderHalSurface->OsSurface.MmcState));
 
-    VP_RENDER_CHK_STATUS_RETURN(osInterface->pfnGetMemoryCompressionFormat(osInterface,
-        &surf->osSurface->OsResource, &renderHalSurface->OsSurface.CompressionFormat));
+    if (m_hwInterface->m_waTable && MEDIA_IS_WA(m_hwInterface->m_waTable, Wa_16023363837))
+    {
+        VP_RENDER_CHK_STATUS_RETURN(InitRenderHalSurfaceCMF(surf->osSurface, renderHalSurface));
+    }
+    else
+    {
+        VP_RENDER_CHK_STATUS_RETURN(osInterface->pfnGetMemoryCompressionFormat(osInterface,
+            &surf->osSurface->OsResource, &renderHalSurface->OsSurface.CompressionFormat));
+    }
 
     renderHalSurface->rcSrc                        = surf->rcSrc;
     renderHalSurface->rcDst                        = surf->rcDst;
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_render_kernel_obj.cpp b/media_softlet/agnostic/common/vp/hal/packet/vp_render_kernel_obj.cpp
index 9f07685..0b41bd2 100644
--- a/media_softlet/agnostic/common/vp/hal/packet/vp_render_kernel_obj.cpp
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_render_kernel_obj.cpp
@@ -24,6 +24,7 @@
 //! \brief    vp render kernel base object.
 //! \details  vp render kernel base object will provided interface where sub kernels processing ways
 //!
+#include <iomanip>
 #include "vp_render_kernel_obj.h"
 #include "vp_dumper.h"
 #include "hal_oca_interface_next.h"
@@ -106,6 +107,34 @@
     HalOcaInterfaceNext::DumpVpKernelInfo(cmdBuffer, (MOS_CONTEXT_HANDLE)&mosContext, m_kernelId, 0, nullptr);
 }
 
+MOS_STATUS VpRenderKernelObj::InitRenderHalSurfaceCMF(MOS_SURFACE* src, PRENDERHAL_SURFACE renderHalSurface)
+{
+    PMOS_INTERFACE        osInterface = m_hwInterface->m_osInterface;
+    VP_RENDER_CHK_NULL_RETURN(osInterface);
+#if !EMUL
+    PGMM_RESOURCE_INFO pGmmResourceInfo;
+    pGmmResourceInfo = (GMM_RESOURCE_INFO *)src->OsResource.pGmmResInfo;
+    MOS_OS_CHK_NULL_RETURN(pGmmResourceInfo);
+
+    GMM_RESOURCE_FORMAT gmmResFmt;
+    gmmResFmt = pGmmResourceInfo->GetResourceFormat();
+    uint32_t          MmcFormat = 0;
+
+    MmcFormat = static_cast<uint32_t>(osInterface->pfnGetGmmClientContext(osInterface)->GetMediaSurfaceStateCompressionFormat(gmmResFmt));
+
+    if (MmcFormat > 0x1F)
+    {
+        MOS_OS_ASSERTMESSAGE("Get a incorrect Compression format(%d) from GMM", MmcFormat);
+    }
+    else
+    {
+        renderHalSurface->OsSurface.CompressionFormat = MmcFormat;
+        MOS_OS_VERBOSEMESSAGE("Render Enigien compression format %d", MmcFormat);
+    }
+#endif
+    return MOS_STATUS_SUCCESS;
+}
+
 // Only for Adv kernels.
 MOS_STATUS VpRenderKernelObj::SetWalkerSetting(KERNEL_THREAD_SPACE &threadSpace, bool bSyncFlag, bool flushL1)
 {
@@ -114,6 +143,14 @@
     return MOS_STATUS_SUCCESS;
 }
 
+MOS_STATUS VpRenderKernelObj::SetTuningFlag(PKERNEL_TUNING_PARAMS tuningParams)
+{
+    VP_FUNC_CALL();
+    m_kernelTuningParams = tuningParams;
+    return MOS_STATUS_SUCCESS;
+}
+
+
 MOS_STATUS VpRenderKernelObj::SetKernelArgs(KERNEL_ARGS &kernelArgs, VP_PACKET_SHARED_CONTEXT *sharedContext)
 {
     VP_FUNC_CALL();
@@ -137,10 +174,16 @@
 
     VP_RENDER_CHK_STATUS_RETURN(SetProcessSurfaceGroup(surfaces));
 
-    VP_RENDER_CHK_STATUS_RETURN(SetSamplerStates(samplerStateGroup));
+    // when UseIndependentSamplerGroup is true, each kernel will set their own sampler state group in VpRenderCmdPacket::SetupSamplerStates()
+    if (!UseIndependentSamplerGroup())
+    {
+        VP_RENDER_CHK_STATUS_RETURN(SetSamplerStates(samplerStateGroup));
+    }
 
     VP_RENDER_CHK_STATUS_RETURN(SetWalkerSetting(kernelParams.kernelThreadSpace, kernelParams.syncFlag,kernelParams.flushL1));
 
+    VP_RENDER_CHK_STATUS_RETURN(SetTuningFlag(&kernelParams.kernelTuningParams));
+
     return MOS_STATUS_SUCCESS;
 }
 
@@ -179,11 +222,43 @@
     return MOS_STATUS_SUCCESS;
 }
 
+MOS_STATUS VpRenderKernelObj::SetupStatelessBuffer()
+{
+    m_statelessArray.clear();
+    VP_RENDER_NORMALMESSAGE("Not prepare stateless buffer in kernel %d.", m_kernelId);
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS VpRenderKernelObj::SetupStatelessBufferResource(SurfaceType surf)
+{
+    VP_RENDER_CHK_NULL_RETURN(m_surfaceGroup);
+    VP_RENDER_CHK_NULL_RETURN(m_hwInterface);
+    if (surf != SurfaceTypeInvalid)
+    {
+        PMOS_INTERFACE osInterface = m_hwInterface->m_osInterface;
+        VP_RENDER_CHK_NULL_RETURN(osInterface);
+        auto           it          = m_surfaceGroup->find(surf);
+        VP_SURFACE    *curSurf     = (m_surfaceGroup->end() != it) ? it->second : nullptr;
+        VP_RENDER_CHK_NULL_RETURN(curSurf);
+        uint64_t ui64GfxAddress = osInterface->pfnGetResourceGfxAddress(osInterface, &curSurf->osSurface->OsResource);
+
+        VP_RENDER_CHK_STATUS_RETURN(osInterface->pfnRegisterResource(
+            osInterface,
+            &curSurf->osSurface->OsResource,
+            false,
+            true));
+        m_statelessArray.insert(std::make_pair(surf, ui64GfxAddress));
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
 MOS_STATUS VpRenderKernelObj::SetProcessSurfaceGroup(VP_SURFACE_GROUP &surfaces)
 {
     m_surfaceGroup = &surfaces;
     VP_RENDER_CHK_STATUS_RETURN(SetupSurfaceState());
     VP_RENDER_CHK_STATUS_RETURN(CpPrepareResources());
+    VP_RENDER_CHK_STATUS_RETURN(SetupStatelessBuffer());
     return MOS_STATUS_SUCCESS;
 }
 
@@ -535,6 +610,33 @@
     return eStatus;
 }
 
+void VpRenderKernelObj::PrintCurbe(uint8_t* pCurbe, uint32_t curbeLength)
+{
+#if (_DEBUG || _RELEASE_INTERNAL)
+    std::string curbeString = "";
+    if (curbeLength > 0 && pCurbe != nullptr)
+    {
+        for (uint32_t i = 0; i < curbeLength; ++i)
+        {
+            uint8_t           iData = pCurbe[i];
+            std::stringstream hex;
+            if (i % 8 == 0)
+            {
+                hex << "offset " << std::setw(3) << std::setfill('0') << i << ": ";
+            }
+            hex << "0x" << std::hex << std::setfill('0') << std::setw(2) << static_cast<int>(iData) << " ";
+            curbeString += hex.str();
+            if (i % 8 == 7)
+            {
+                curbeString += "\n";
+            }
+        }
+    }
+    VP_RENDER_VERBOSEMESSAGE("Curbe Data Length = %d, Content = \n%s",
+        curbeLength,
+        curbeString.c_str());
+#endif
+}
 
 void VpRenderKernelObj::DumpSurface(VP_SURFACE* pSurface, PCCHAR fileName)
 {
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_render_kernel_obj.h b/media_softlet/agnostic/common/vp/hal/packet/vp_render_kernel_obj.h
index b439413..41b8701 100644
--- a/media_softlet/agnostic/common/vp/hal/packet/vp_render_kernel_obj.h
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_render_kernel_obj.h
@@ -73,6 +73,17 @@
     uint32_t                             iCapcityOfSurfaceEntry = 0;
 } KERNEL_SURFACE_STATE_PARAM;
 
+typedef struct _KERNEL_TUNING_PARAMS
+{
+    uint32_t euThreadSchedulingMode;
+} KERNEL_TUNING_PARAMS, *PKERNEL_TUNING_PARAMS;
+
+typedef struct _SURFACE_PARAMS
+{
+    SurfaceType surfType;
+    bool        isOutput;
+} SURFACE_PARAMS, *PSURFACE_PARAMS;
+
 using KERNEL_CONFIGS = std::map<VpKernelID, void *>; // Only for legacy/non-cm kernels
 using KERNEL_ARGS = std::vector<KRN_ARG>;
 using KERNEL_SAMPLER_STATE_GROUP = std::map<SamplerIndex, MHW_SAMPLER_STATE_PARAM>;
@@ -80,7 +91,8 @@
 using KERNEL_SAMPLER_INDEX = std::vector<SamplerIndex>;
 using KERNEL_SURFACE_CONFIG = std::map<SurfaceType, KERNEL_SURFACE_STATE_PARAM>;
 using KERNEL_SURFACE_BINDING_INDEX = std::map<SurfaceType, std::set<uint32_t>>;
-using KERNEL_ARG_INDEX_SURFACE_MAP = std::map<uint32_t, SurfaceType>;
+using KERNEL_ARG_INDEX_SURFACE_MAP = std::map<uint32_t, SURFACE_PARAMS>;
+using KERNEL_STATELESS_BUFF_CONFIG = std::map<SurfaceType, uint64_t>;
 
 typedef struct _KERNEL_PARAMS
 {
@@ -89,6 +101,7 @@
     KERNEL_THREAD_SPACE  kernelThreadSpace;
     bool                 syncFlag;
     bool                 flushL1;
+    KERNEL_TUNING_PARAMS kernelTuningParams;
 } KERNEL_PARAMS;
 
 struct MEDIA_OBJECT_KA2_INLINE_DATA
@@ -341,6 +354,7 @@
     {
         VP_PUBLIC_CHK_STATUS_RETURN(GetCurbeState(curbe, curbeLength));
         VP_PUBLIC_CHK_STATUS_RETURN(GetAlignedLength(curbeLength, curbeLengthAligned, kernelParam, dwBlockAlign));
+        PrintCurbe(static_cast<uint8_t *>(curbe), curbeLength);
         return MOS_STATUS_SUCCESS;
     }
 
@@ -390,6 +404,8 @@
 
     virtual void DumpSurface(VP_SURFACE *pSurface,PCCHAR fileName);
 
+    virtual void PrintCurbe(uint8_t *pCurbe, uint32_t curbeLength);
+
     // Kernel Common configs
     virtual MOS_STATUS GetKernelSettings(RENDERHAL_KERNEL_PARAM &settsings)
     {
@@ -476,6 +492,11 @@
         return m_isAdvKernel;
     }
 
+    bool UseIndependentSamplerGroup()
+    {
+        return m_useIndependentSamplerGroup;
+    }
+
     virtual MOS_STATUS SetSamplerStates(KERNEL_SAMPLER_STATE_GROUP& samplerStateGroup);
 
     virtual MOS_STATUS UpdateCompParams()
@@ -503,6 +524,14 @@
 
     virtual void OcaDumpKernelInfo(MOS_COMMAND_BUFFER &cmdBuffer, MOS_CONTEXT &mosContext);
 
+    virtual uint32_t GetEuThreadSchedulingMode()
+    {
+        // hw default mode
+        return 0;
+    }
+
+    virtual MOS_STATUS InitRenderHalSurfaceCMF(MOS_SURFACE* src, PRENDERHAL_SURFACE renderHalSurface);
+
 protected:
 
     virtual MOS_STATUS SetWalkerSetting(KERNEL_THREAD_SPACE &threadSpace, bool bSyncFlag, bool flushL1 = false);
@@ -517,6 +546,10 @@
 
     virtual MOS_STATUS CpPrepareResources();
 
+    virtual MOS_STATUS SetupStatelessBuffer();
+
+    virtual MOS_STATUS SetupStatelessBufferResource(SurfaceType surf);
+
     virtual MOS_STATUS GetCurbeState(void *&curbe, uint32_t &curbeLength) = 0;
 
     virtual MOS_STATUS GetAlignedLength(uint32_t &curbeLength, uint32_t &curbeLengthAligned, RENDERHAL_KERNEL_PARAM kernelParam, uint32_t dwBlockAlign)
@@ -525,6 +558,8 @@
         return MOS_STATUS_SUCCESS;
     }
 
+    virtual MOS_STATUS SetTuningFlag(PKERNEL_TUNING_PARAMS tuningParams);
+
 protected:
 
     VP_SURFACE_GROUP                                        *m_surfaceGroup = nullptr;  // input surface process surface groups
@@ -533,7 +568,7 @@
     KERNEL_SURFACE_BINDING_INDEX                            m_surfaceBindingIndex;      // store the binding index for processed surface
     PVpAllocator                                            m_allocator = nullptr;
     MediaUserSettingSharedPtr                               m_userSettingPtr = nullptr;  // usersettingInstance
-
+    KERNEL_STATELESS_BUFF_CONFIG                            m_statelessArray;
     // kernel attribute 
     std::string                                             m_kernelName = "";
     void *                                                  m_kernelBinary = nullptr;
@@ -543,7 +578,10 @@
     DelayLoadedKernelType                                   m_kernelType     = KernelNone;
     KernelIndex                                             m_kernelIndex = 0;          // index of current kernel in KERNEL_PARAMS_LIST
 
+    PKERNEL_TUNING_PARAMS                                   m_kernelTuningParams = nullptr;
+
     bool                                                    m_isAdvKernel = false;      // true mean multi kernel can be submitted in one workload.
+    bool                                                    m_useIndependentSamplerGroup = false; //true means multi kernels has their own stand alone sampler states group. only can be true when m_isAdvKernel is true.
 
     std::shared_ptr<mhw::vebox::Itf>                        m_veboxItf = nullptr;
 
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_render_l0_fc_kernel.cpp b/media_softlet/agnostic/common/vp/hal/packet/vp_render_l0_fc_kernel.cpp
new file mode 100644
index 0000000..0992c28
--- /dev/null
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_render_l0_fc_kernel.cpp
@@ -0,0 +1,357 @@
+/*
+* Copyright (c) 2024, Intel Corporation
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*/
+//!
+//! \file     vp_render_vebox_update_cmd_packet.cpp
+//! \brief    render packet which used in by mediapipline.
+//! \details  render packet provide the structures and generate the cmd buffer which mediapipline will used.
+//!
+
+#include "vp_render_l0_fc_kernel.h"
+
+using namespace vp;
+
+VpRenderL0FcKernel::VpRenderL0FcKernel(PVP_MHWINTERFACE hwInterface, VpKernelID kernelID, uint32_t kernelIndex, PVpAllocator allocator) : VpRenderKernelObj(hwInterface, kernelID, kernelIndex, "", allocator)
+{
+    m_renderHal = hwInterface ? hwInterface->m_renderHal : nullptr;
+    m_layer     = kernelIndex;
+
+    switch (kernelID)
+    {
+    case kernelFcDScale444:
+        m_kernelName = "PA_444D_fc_scale";
+        break;
+    default:
+        m_kernelName.assign("");
+        VP_RENDER_ASSERTMESSAGE("Kernel ID cannot map to Kernel Name");
+        break;
+    }
+    m_isAdvKernel                = true;
+    m_useIndependentSamplerGroup = true;
+    m_kernelBinaryID             = VP_ADV_KERNEL_BINARY_ID(kernelID);
+}
+
+VpRenderL0FcKernel::~VpRenderL0FcKernel()
+{
+    MOS_SafeFreeMemory(m_curbe);
+    m_curbe = nullptr;
+}
+
+MOS_STATUS VpRenderL0FcKernel::Init(VpRenderKernel &kernel)
+{
+    VP_FUNC_CALL();
+
+    VP_RENDER_NORMALMESSAGE("Initializing L0 FC krn %s", kernel.GetKernelName().c_str());
+
+    m_kernelSize = kernel.GetKernelSize();
+
+    uint8_t *pKernelBin = (uint8_t *)kernel.GetKernelBinPointer();
+    VP_RENDER_CHK_NULL_RETURN(pKernelBin);
+
+    m_kernelBinary = pKernelBin + kernel.GetKernelBinOffset();
+
+    m_kernelArgs = kernel.GetKernelArgs();
+
+    for (auto arg : m_kernelArgs)
+    {
+        arg.pData = nullptr;
+    }
+
+    m_kernelBtis = kernel.GetKernelBtis();
+
+    m_kernelEnv = kernel.GetKernelExeEnv();
+
+    m_curbeSize = kernel.GetCurbeSize();
+
+    m_inlineData.resize(m_kernelEnv.uInlineDataPayloadSize);
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS VpRenderL0FcKernel::SetSamplerStates(KERNEL_SAMPLER_STATE_GROUP &samplerStateGroup)
+{
+    VP_FUNC_CALL();
+
+    if (m_kernelEnv.bHasSample)
+    {
+        samplerStateGroup.clear();
+        MHW_SAMPLER_STATE_PARAM samplerStateParam = {};
+
+        samplerStateParam.Unorm.SamplerFilterMode = MHW_SAMPLER_FILTER_BILINEAR;
+        samplerStateParam.Unorm.MagFilter = MHW_GFX3DSTATE_MAPFILTER_LINEAR;
+        samplerStateParam.Unorm.MinFilter = MHW_GFX3DSTATE_MAPFILTER_LINEAR;
+
+        samplerStateParam.Unorm.AddressU = MHW_GFX3DSTATE_TEXCOORDMODE_CLAMP;
+        samplerStateParam.Unorm.AddressV = MHW_GFX3DSTATE_TEXCOORDMODE_CLAMP;
+        samplerStateParam.Unorm.AddressW = MHW_GFX3DSTATE_TEXCOORDMODE_CLAMP;
+
+        samplerStateParam.bInUse      = true;
+        samplerStateParam.SamplerType = MHW_SAMPLER_TYPE_3D;
+
+        samplerStateGroup.insert(std::make_pair(m_samplerIndex, samplerStateParam));
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS VpRenderL0FcKernel::SetKernelArgs(KERNEL_ARGS &kernelArgs, VP_PACKET_SHARED_CONTEXT *sharedContext)
+{
+    VP_FUNC_CALL();
+
+    //All pData will be free in VpL0FcFilter::Destroy so no need to free here
+    for (KRN_ARG &srcArg : kernelArgs)
+    {
+        for (KRN_ARG &dstArg : m_kernelArgs)
+        {
+            if (srcArg.uIndex == dstArg.uIndex)
+            {
+                if (dstArg.eArgKind == ARG_KIND_GENERAL || dstArg.eArgKind == ARG_KIND_INLINE)
+                {
+                    if (srcArg.pData == nullptr)
+                    {
+                        VP_RENDER_ASSERTMESSAGE("The Kernel Argument General Data is null! KernelID %d, argIndex %d", m_kernelId, dstArg.uIndex);
+                        return MOS_STATUS_INVALID_PARAMETER;
+                    }
+                    else
+                    {
+                        dstArg.eArgKind = srcArg.eArgKind;
+                        dstArg.pData    = srcArg.pData;
+                        srcArg.pData    = nullptr;
+                    }
+                }
+                else if (dstArg.eArgKind == ARG_KIND_SAMPLER)
+                {
+                    m_samplerIndex = dstArg.uOffsetInPayload;
+                }
+            }
+        }
+
+        if (srcArg.eArgKind == ARG_KIND_SURFACE)
+        {
+            if (srcArg.pData == nullptr)
+            {
+                VP_RENDER_ASSERTMESSAGE("The Kernel Argument Surface is null! KernelID %d, argIndex %d", m_kernelId, srcArg.uIndex);
+                return MOS_STATUS_INVALID_PARAMETER;
+            }
+            else
+            {
+                SURFACE_PARAMS surfaceParams;
+                surfaceParams.isOutput = srcArg.isOutput;
+                surfaceParams.surfType = *(SurfaceType *)srcArg.pData;
+                m_argIndexSurfMap.insert(std::make_pair(srcArg.uIndex, surfaceParams));
+                srcArg.pData = nullptr;
+            }
+        }
+
+        if (srcArg.pData != nullptr)
+        {
+            srcArg.pData = nullptr;
+            VP_RENDER_ASSERTMESSAGE("The Kernel Argument is set but not used. KernelID %d, argIndex %d", m_kernelId, srcArg.uIndex);
+        }
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS VpRenderL0FcKernel::GetCurbeState(void *&curbe, uint32_t &curbeLength)
+{
+    VP_FUNC_CALL();
+    curbeLength = m_curbeSize;
+
+    VP_RENDER_NORMALMESSAGE("KernelID %d, Curbe Size %d\n", m_kernelId, curbeLength);
+
+    if (curbeLength == 0)
+    {
+        return MOS_STATUS_INVALID_PARAMETER;
+    }
+
+    uint8_t *pCurbe = (uint8_t *)MOS_AllocAndZeroMemory(curbeLength);
+    VP_RENDER_CHK_NULL_RETURN(pCurbe);
+    MOS_FreeMemAndSetNull(m_curbe);
+    m_curbe = pCurbe;
+
+    for (auto &arg : m_kernelArgs)
+    {
+        switch (arg.eArgKind)
+        {
+        case ARG_KIND_GENERAL:
+        case ARG_KIND_SURFACE:
+            if (arg.pData != nullptr)
+            {
+                MOS_SecureMemcpy(pCurbe + arg.uOffsetInPayload, arg.uSize, arg.pData, arg.uSize);
+                VP_RENDER_NORMALMESSAGE("Setting Curbe State KernelID %d, index %d , value %d, argKind %d", m_kernelId, arg.uIndex, *(uint32_t *)arg.pData, arg.eArgKind);
+            }
+            else
+            {
+                VP_RENDER_NORMALMESSAGE("KernelID %d, index %d, argKind %d is empty", m_kernelId, arg.uIndex, arg.eArgKind);
+            }
+            break;
+        case ARG_KIND_INLINE:
+        case ARG_KIND_SAMPLER:
+            break;
+        default:
+            VP_PUBLIC_CHK_STATUS_RETURN(MOS_STATUS_UNIMPLEMENTED);
+        }
+    }
+
+    curbe = pCurbe;
+
+    PrintCurbe(pCurbe, curbeLength);
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS VpRenderL0FcKernel::SetupSurfaceState()
+{
+    VP_FUNC_CALL();
+
+    KERNEL_SURFACE_STATE_PARAM kernelSurfaceParam;
+
+    for (auto it = m_kernelBtis.begin(); it != m_kernelBtis.end(); ++it)
+    {
+        uint32_t argIndex = it->first;
+        uint32_t bti      = it->second;
+
+        VP_RENDER_NORMALMESSAGE("Setting Surface State for L0 FC. KernelID %d, layer %d, argIndex %d , bti %d", m_kernelId, m_layer, argIndex, bti);
+
+        MOS_ZeroMemory(&kernelSurfaceParam, sizeof(KERNEL_SURFACE_STATE_PARAM));
+        kernelSurfaceParam.surfaceOverwriteParams.updatedRenderSurfaces = true;
+        kernelSurfaceParam.surfaceOverwriteParams.bindedKernel          = true;
+        PRENDERHAL_SURFACE_STATE_PARAMS pRenderSurfaceParams            = &kernelSurfaceParam.surfaceOverwriteParams.renderSurfaceParams;
+        pRenderSurfaceParams->bAVS                                      = false;
+        pRenderSurfaceParams->Boundary                                  = RENDERHAL_SS_BOUNDARY_ORIGINAL;
+        SurfaceType         surfType                                    = SurfaceTypeInvalid;
+        MOS_HW_RESOURCE_DEF resourceType                                = MOS_HW_RESOURCE_USAGE_VP_INTERNAL_READ_WRITE_RENDER;
+
+        auto surfHandle = m_argIndexSurfMap.find(argIndex);
+        VP_PUBLIC_CHK_NOT_FOUND_RETURN(surfHandle, &m_argIndexSurfMap);
+        surfType = surfHandle->second.surfType;
+        if (surfType == SurfaceTypeInvalid)
+        {
+            VP_RENDER_NORMALMESSAGE("Will skip surface argIndex %d, bti %d for it is set as invalid", argIndex, bti);
+            continue;
+        }
+        pRenderSurfaceParams->isOutput = surfHandle->second.isOutput;
+        if (m_surfaceState.find(surfType) != m_surfaceState.end())
+        {
+            UpdateCurbeBindingIndex(surfType, bti);
+            continue;
+        }
+        auto surf = m_surfaceGroup->find(surfType);
+        if (m_surfaceGroup->end() == surf)
+        {
+            VP_RENDER_ASSERTMESSAGE("surf was not found %d", surfType);
+            return MOS_STATUS_NULL_POINTER;
+        }
+        VP_RENDER_CHK_NULL_RETURN(surf->second);
+        VP_RENDER_CHK_NULL_RETURN(surf->second->osSurface);
+        kernelSurfaceParam.surfaceOverwriteParams.updatedSurfaceParams = true;
+        kernelSurfaceParam.surfaceOverwriteParams.format = surf->second->osSurface->Format;
+        kernelSurfaceParam.surfaceOverwriteParams.width  = MOS_MIN(surf->second->osSurface->dwWidth, static_cast<uint64_t>(surf->second->rcSrc.right));
+        kernelSurfaceParam.surfaceOverwriteParams.height = MOS_MIN(surf->second->osSurface->dwHeight, static_cast<uint64_t>(surf->second->rcSrc.bottom));
+
+        pRenderSurfaceParams->MemObjCtl = (m_renderHal->pOsInterface->pfnCachePolicyGetMemoryObject(
+                                               resourceType,
+                                               m_renderHal->pOsInterface->pfnGetGmmClientContext(m_renderHal->pOsInterface)))
+                                              .DwordValue;
+        pRenderSurfaceParams->Component   = COMPONENT_VPCommon;
+
+        if (surf->second->osSurface->Type == MOS_GFXRES_BUFFER)
+        {
+            kernelSurfaceParam.surfaceOverwriteParams.updatedSurfaceParams = true;
+            kernelSurfaceParam.surfaceOverwriteParams.bufferResource       = true;
+        }
+
+        m_surfaceState.insert(std::make_pair(surfType, kernelSurfaceParam));
+
+        UpdateCurbeBindingIndex(surfType, bti);
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS VpRenderL0FcKernel::GetWalkerSetting(KERNEL_WALKER_PARAMS &walkerParam, KERNEL_PACKET_RENDER_DATA &renderData)
+{
+    VP_FUNC_CALL();
+
+    walkerParam = m_walkerParam;
+
+    walkerParam.iBindingTable = renderData.bindingTable;
+    walkerParam.iMediaID      = renderData.mediaID;
+    walkerParam.iCurbeOffset  = renderData.iCurbeOffset;
+    // Should use renderData.iCurbeLength instead of kernelSettings.CURBE_Length.
+    // kernelSettings.CURBE_Length is 32 aligned with 5 bits shift.
+    // renderData.iCurbeLength is RENDERHAL_CURBE_BLOCK_ALIGN(64) aligned.
+    walkerParam.iCurbeLength = renderData.iCurbeLength;
+
+    return MOS_STATUS_SUCCESS;
+}
+
+// Only for Adv kernels.
+MOS_STATUS VpRenderL0FcKernel::SetWalkerSetting(KERNEL_THREAD_SPACE &threadSpace, bool bSyncFlag, bool flushL1)
+{
+    VP_FUNC_CALL();
+    MOS_ZeroMemory(&m_walkerParam, sizeof(KERNEL_WALKER_PARAMS));
+
+    m_walkerParam.iBlocksX          = threadSpace.uWidth;
+    m_walkerParam.iBlocksY          = threadSpace.uHeight;
+    m_walkerParam.threadWidth       = threadSpace.uLocalWidth;
+    m_walkerParam.threadHeight      = threadSpace.uLocalHeight;
+    m_walkerParam.threadDepth       = 1;
+    m_walkerParam.isVerticalPattern = false;
+    m_walkerParam.bSyncFlag         = bSyncFlag;
+
+    m_walkerParam.pipeControlParams.bUpdateNeeded              = true;
+    m_walkerParam.pipeControlParams.bEnableDataPortFlush       = true;
+    m_walkerParam.pipeControlParams.bUnTypedDataPortCacheFlush = true;
+    m_walkerParam.pipeControlParams.bFlushRenderTargetCache    = false;
+    m_walkerParam.pipeControlParams.bInvalidateTextureCache    = false;
+
+    for (auto &arg : m_kernelArgs)
+    {
+        if (arg.eArgKind == ARG_KIND_INLINE)
+        {
+            if (arg.pData != nullptr)
+            {
+                MOS_SecureMemcpy(m_inlineData.data() + arg.uOffsetInPayload, arg.uSize, arg.pData, arg.uSize);
+                VP_RENDER_NORMALMESSAGE("Setting Inline Data KernelID %d, index %d , value %d, argKind %d", m_kernelId, arg.uIndex, *(uint32_t *)arg.pData, arg.eArgKind);
+            }
+            else
+            {
+                VP_RENDER_NORMALMESSAGE("KernelID %d, index %d, argKind %d is empty", m_kernelId, arg.uIndex, arg.eArgKind);
+            }
+        }
+    }
+    m_walkerParam.inlineDataLength = m_inlineData.size();
+    m_walkerParam.inlineData       = m_inlineData.data();
+    
+    if (m_kernelEnv.uSimdSize != 1 &&
+        (m_kernelEnv.uiWorkGroupWalkOrderDimensions[0] != 0 || 
+         m_kernelEnv.uiWorkGroupWalkOrderDimensions[1] != 0 || 
+         m_kernelEnv.uiWorkGroupWalkOrderDimensions[2] != 0))
+    {
+        m_walkerParam.isEmitInlineParameter = true;
+        m_walkerParam.isGenerateLocalID     = true;
+        m_walkerParam.emitLocal             = MHW_EMIT_LOCAL_XYZ;
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
\ No newline at end of file
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_render_l0_fc_kernel.h b/media_softlet/agnostic/common/vp/hal/packet/vp_render_l0_fc_kernel.h
new file mode 100644
index 0000000..020c432
--- /dev/null
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_render_l0_fc_kernel.h
@@ -0,0 +1,74 @@
+/*
+* Copyright (c) 2024, Intel Corporation
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*/
+#ifndef __VP_RENDER_L0_FC_KERNEL_H__
+#define __VP_RENDER_L0_FC_KERNEL_H__
+
+#include "vp_platform_interface.h"
+#include "vp_render_kernel_obj.h"
+#include "vp_render_cmd_packet.h"
+
+namespace vp
+{
+
+class VpRenderL0FcKernel : public VpRenderKernelObj
+{
+public:
+    VpRenderL0FcKernel(PVP_MHWINTERFACE hwInterface, VpKernelID kernelID, uint32_t kernelIndex, PVpAllocator allocator);
+    virtual ~VpRenderL0FcKernel();
+
+    virtual MOS_STATUS Init(VpRenderKernel &kernel);
+    virtual MOS_STATUS GetCurbeState(void *&curbe, uint32_t &curbeLength);
+    virtual uint32_t   GetInlineDataSize() override
+    {
+        return 0;
+    }
+    virtual MOS_STATUS SetSamplerStates(KERNEL_SAMPLER_STATE_GROUP &samplerStateGroup);
+    virtual MOS_STATUS GetWalkerSetting(KERNEL_WALKER_PARAMS &walkerParam, KERNEL_PACKET_RENDER_DATA &renderData);
+
+    MOS_STATUS FreeCurbe(void *&curbe)
+    {
+        return MOS_STATUS_SUCCESS;
+    }
+
+protected:
+    virtual MOS_STATUS SetupSurfaceState() override;
+    virtual MOS_STATUS SetWalkerSetting(KERNEL_THREAD_SPACE &threadSpace, bool bSyncFlag, bool flushL1 = false);
+    virtual MOS_STATUS SetKernelArgs(KERNEL_ARGS &kernelArgs, VP_PACKET_SHARED_CONTEXT *sharedContext);
+
+    PRENDERHAL_INTERFACE m_renderHal      = nullptr;
+
+    //kernel Arguments
+    KERNEL_ARGS                  m_kernelArgs      = {};
+    KERNEL_BTIS                  m_kernelBtis      = {};
+    KRN_EXECUTE_ENV              m_kernelEnv       = {};
+    KERNEL_WALKER_PARAMS         m_walkerParam     = {};
+    void                        *m_curbe           = nullptr;
+    uint32_t                     m_layer           = 0;
+    uint32_t                     m_curbeSize       = 0;
+    uint32_t                     m_samplerIndex    = 0;
+    std ::vector<uint8_t>        m_inlineData      = {};
+    KERNEL_ARG_INDEX_SURFACE_MAP m_argIndexSurfMap = {};
+
+MEDIA_CLASS_DEFINE_END(vp__VpRenderL0FcKernel)
+};
+}  // namespace vp
+#endif  //__VP_RENDER_L0_FC_KERNEL_H__
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_render_sfc_base.cpp b/media_softlet/agnostic/common/vp/hal/packet/vp_render_sfc_base.cpp
index 6d8b77c..5bd2129 100644
--- a/media_softlet/agnostic/common/vp/hal/packet/vp_render_sfc_base.cpp
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_render_sfc_base.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2022-2023, Intel Corporation
+* Copyright (c) 2022-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -663,6 +663,7 @@
     m_renderData.sfcStateParams->fColorFillUGPixel = scalingParams->sfcColorfillParams.fColorFillUGPixel;
     m_renderData.sfcStateParams->fColorFillVBPixel = scalingParams->sfcColorfillParams.fColorFillVBPixel;
     m_renderData.sfcStateParams->fColorFillYRPixel = scalingParams->sfcColorfillParams.fColorFillYRPixel;
+    m_renderData.sfcStateParams->isDemosaicEnabled = scalingParams->isDemosaicNeeded;
 
     // SfcInputFormat should be initialized during SetCscParams if SfcInputFormat not being Format_Any.
     if (Format_Any == m_renderData.SfcInputFormat)
@@ -844,6 +845,8 @@
 
     m_renderData.sfcStateParams->bRGBASwapEnable = IsOutputChannelSwapNeeded(cscParams->outputFormat);
     m_renderData.sfcStateParams->bInputColorSpace = cscParams->isInputColorSpaceRGB;
+    m_renderData.sfcStateParams->isFullRgbG10P709 = cscParams->isFullRgbG10P709;
+    m_renderData.sfcStateParams->isDemosaicEnabled = cscParams->isDemosaicNeeded;
 
     // Dithering parameter
     if (cscParams->isDitheringNeeded && !m_disableSfcDithering)
@@ -991,7 +994,14 @@
     }
     else if (mhw::sfc::SFC_PIPE_MODE_VEBOX == m_pipeMode)
     {
-        sfcStateParams->dwVDVEInputOrderingMode = MEDIASTATE_SFC_INPUT_ORDERING_VE_4x8;
+        if (m_renderData.sfcStateParams && m_renderData.sfcStateParams->isDemosaicEnabled)
+        {
+            sfcStateParams->dwVDVEInputOrderingMode = MEDIASTATE_SFC_INPUT_ORDERING_VE_4x4;
+        }
+        else
+        {
+            sfcStateParams->dwVDVEInputOrderingMode = MEDIASTATE_SFC_INPUT_ORDERING_VE_4x8;
+        }
     }
     else if (MEDIASTATE_SFC_PIPE_VE_TO_SFC_INTEGRAL == m_pipeMode)
     {
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_render_vebox_hdr_3dlut_l0_kernel.cpp b/media_softlet/agnostic/common/vp/hal/packet/vp_render_vebox_hdr_3dlut_l0_kernel.cpp
new file mode 100644
index 0000000..e979e6d
--- /dev/null
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_render_vebox_hdr_3dlut_l0_kernel.cpp
@@ -0,0 +1,620 @@
+/*
+* Copyright (c) 2024, Intel Corporation
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*/
+//!
+//! \file     vp_render_vebox_hdr_3dlut_l0_kernel.cpp
+//! \brief    render packet which used in by mediapipline.
+//! \details  render packet provide the structures and generate the cmd buffer which mediapipline will used.
+//!
+#include "vp_render_vebox_hdr_3dlut_l0_kernel.h"
+#include "vp_dumper.h"
+#include "vp_kernelset.h"
+
+using namespace vp;
+
+static const float ccm_identity[12]               = {1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f};
+static float       color_matrix_calculation[3][4] = {0.0f};
+
+template <typename T>
+void mat_3by3_inv(T *m1, T *m2)
+{
+    double a11, a12, a13, a21, a22, a23, a31, a32, a33;
+    double det, det_inv;
+
+    a11 = *m1;
+    a12 = *(m1 + 1);
+    a13 = *(m1 + 2);
+    a21 = *(m1 + 3);
+    a22 = *(m1 + 4);
+    a23 = *(m1 + 5);
+    a31 = *(m1 + 6);
+    a32 = *(m1 + 7);
+    a33 = *(m1 + 8);
+
+    det = a11 * (a33 * a22 - a32 * a23) - a21 * (a33 * a12 - a32 * a13) + a31 * (a12 * a23 - a13 * a22);
+
+    det_inv = 1 / det;
+
+    *m2       = (float)(det_inv * (a33 * a22 - a32 * a23));
+    *(m2 + 1) = (float)(-det_inv * (a33 * a12 - a32 * a13));
+    *(m2 + 2) = (float)(det_inv * (a12 * a23 - a13 * a22));
+    *(m2 + 3) = (float)(-det_inv * (a33 * a21 - a31 * a23));
+    *(m2 + 4) = (float)(det_inv * (a33 * a11 - a31 * a13));
+    *(m2 + 5) = (float)(-det_inv * (a23 * a11 - a21 * a13));
+    *(m2 + 6) = (float)(det_inv * (a32 * a21 - a31 * a22));
+    *(m2 + 7) = (float)(-det_inv * (a32 * a11 - a31 * a12));
+    *(m2 + 8) = (float)(det_inv * (a22 * a11 - a21 * a12));
+}
+
+template <typename T>
+void mat_mul_float(T *m1, T *m2, T *m3, short m_size, short n_size, short l_size)
+{
+    int    i, j, k, Tjn, Tjl, off3;
+    float *m1_offs, *m2_offs, *m2_k_offs, *m3_offs;
+
+    for (j = 0; j < m_size; j++)
+    {
+        Tjn = j * n_size;
+        Tjl = j * l_size;
+        for (k = 0; k < l_size; k++)
+        {
+            off3      = Tjl + k;
+            m3_offs   = m3 + off3;
+            *m3_offs  = 0;
+            m2_k_offs = m2 + k;
+            m1_offs   = m1 + Tjn;
+            for (i = 0; i < n_size; i++)
+            {
+                m2_offs = m2_k_offs + i * l_size;
+                *m3_offs += *m1_offs * *m2_offs;
+                m1_offs++;
+            }
+        }
+    }
+}
+static void CalcCCMMatrix()
+{
+    float mat_rgb2xyz_src[3][3], mat_rgb2xyz_dst[3][3];
+    float mat_xyz[3][3], mat_invxyz[3][3];
+    float matW[3];
+    float matE[3] = {};
+
+    float fccmSrcZR, fccmSrcZG, fccmSrcZB, fccmSrcZW;
+    float fccmDstZR, fccmDstZG, fccmDstZB, fccmDstZW;
+
+    const float fccmSrcXR = 0.708000000000000f;
+    const float fccmSrcYR = 0.292000000000000f;
+    const float fccmSrcXG = 0.170000000000000f;
+    const float fccmSrcYG = 0.797000000000000f;
+    const float fccmSrcXB = 0.131000000000000f;
+    const float fccmSrcYB = 0.046000000000000f;
+    const float fccmSrcXW = 0.312700000000000f;
+    const float fccmSrcYW = 0.329000000000000f;
+    const float fccmDstXR = 0.640000000000000f;
+    const float fccmDstYR = 0.330000000000000f;
+    const float fccmDstXG = 0.300000000000000f;
+    const float fccmDstYG = 0.600000000000000f;
+    const float fccmDstXB = 0.150000000000000f;
+    const float fccmDstYB = 0.060000000000000f;
+    const float fccmDstXW = 0.312700000000000f;
+    const float FccmDstYW = 0.329000000000000f;
+
+    fccmSrcZR = 1 - fccmSrcXR - fccmSrcYR;
+    fccmSrcZG = 1 - fccmSrcXG - fccmSrcYG;
+    fccmSrcZB = 1 - fccmSrcXB - fccmSrcYB;
+    fccmSrcZW = 1 - fccmSrcXW - fccmSrcYW;
+
+    mat_xyz[0][0] = fccmSrcXR;
+    mat_xyz[0][1] = fccmSrcXG;
+    mat_xyz[0][2] = fccmSrcXB;
+    mat_xyz[1][0] = fccmSrcYR;
+    mat_xyz[1][1] = fccmSrcYG;
+    mat_xyz[1][2] = fccmSrcYB;
+    mat_xyz[2][0] = fccmSrcZR;
+    mat_xyz[2][1] = fccmSrcZG;
+    mat_xyz[2][2] = fccmSrcZB;
+
+    mat_3by3_inv(mat_xyz[0], mat_invxyz[0]);
+
+    matW[0] = fccmSrcXW / fccmSrcYW;
+    matW[1] = 1;
+    matW[2] = fccmSrcZW / fccmSrcYW;
+
+    mat_mul_float(mat_invxyz[0], matW, matE, 3, 3, 1);
+
+    mat_rgb2xyz_src[0][0] = matE[0] * fccmSrcXR;
+    mat_rgb2xyz_src[1][0] = matE[0] * fccmSrcYR;
+    mat_rgb2xyz_src[2][0] = matE[0] * fccmSrcZR;
+    mat_rgb2xyz_src[0][1] = matE[1] * fccmSrcXG;
+    mat_rgb2xyz_src[1][1] = matE[1] * fccmSrcYG;
+    mat_rgb2xyz_src[2][1] = matE[1] * fccmSrcZG;
+    mat_rgb2xyz_src[0][2] = matE[2] * fccmSrcXB;
+    mat_rgb2xyz_src[1][2] = matE[2] * fccmSrcYB;
+    mat_rgb2xyz_src[2][2] = matE[2] * fccmSrcZB;
+
+    fccmDstZR = 1 - fccmDstXR - fccmDstYR;
+    fccmDstZG = 1 - fccmDstXG - fccmDstYG;
+    fccmDstZB = 1 - fccmDstXB - fccmDstYB;
+    fccmDstZW = 1 - fccmDstXW - FccmDstYW;
+
+    mat_xyz[0][0] = fccmDstXR;
+    mat_xyz[0][1] = fccmDstXG;
+    mat_xyz[0][2] = fccmDstXB;
+    mat_xyz[1][0] = fccmDstYR;
+    mat_xyz[1][1] = fccmDstYG;
+    mat_xyz[1][2] = fccmDstYB;
+    mat_xyz[2][0] = fccmDstZR;
+    mat_xyz[2][1] = fccmDstZG;
+    mat_xyz[2][2] = fccmDstZB;
+
+    mat_3by3_inv(mat_xyz[0], mat_invxyz[0]);
+
+    matW[0] = fccmDstXW / FccmDstYW;
+    matW[1] = 1;
+    matW[2] = fccmDstZW / FccmDstYW;
+
+    mat_mul_float(mat_invxyz[0], matW, matE, 3, 3, 1);
+
+    mat_rgb2xyz_dst[0][0] = matE[0] * fccmDstXR;
+    mat_rgb2xyz_dst[1][0] = matE[0] * fccmDstYR;
+    mat_rgb2xyz_dst[2][0] = matE[0] * fccmDstZR;
+    mat_rgb2xyz_dst[0][1] = matE[1] * fccmDstXG;
+    mat_rgb2xyz_dst[1][1] = matE[1] * fccmDstYG;
+    mat_rgb2xyz_dst[2][1] = matE[1] * fccmDstZG;
+    mat_rgb2xyz_dst[0][2] = matE[2] * fccmDstXB;
+    mat_rgb2xyz_dst[1][2] = matE[2] * fccmDstYB;
+    mat_rgb2xyz_dst[2][2] = matE[2] * fccmDstZB;
+
+    float mat_invrgb2xyz_dst[3][3];
+    mat_3by3_inv(mat_rgb2xyz_dst[0], mat_invrgb2xyz_dst[0]);
+
+    float CCMmat[3][3];
+    mat_mul_float(mat_invrgb2xyz_dst[0], mat_rgb2xyz_src[0], CCMmat[0], 3, 3, 3);
+
+    color_matrix_calculation[0][0] = CCMmat[0][0];
+    color_matrix_calculation[0][1] = CCMmat[0][1];
+    color_matrix_calculation[0][2] = CCMmat[0][2];
+    color_matrix_calculation[0][3] = 0.0f;
+    color_matrix_calculation[1][0] = CCMmat[1][0];
+    color_matrix_calculation[1][1] = CCMmat[1][1];
+    color_matrix_calculation[1][2] = CCMmat[1][2];
+    color_matrix_calculation[1][3] = 0.0f;
+    color_matrix_calculation[2][0] = CCMmat[2][0];
+    color_matrix_calculation[2][1] = CCMmat[2][1];
+    color_matrix_calculation[2][2] = CCMmat[2][2];
+    color_matrix_calculation[2][3] = 0.0f;
+}
+
+// Used by L0 kernel
+VpRenderHdr3DLutL0Kernel::VpRenderHdr3DLutL0Kernel(PVP_MHWINTERFACE hwInterface, PVpAllocator allocator) :
+    VpRenderKernelObj(hwInterface, (VpKernelID)kernelHdr3DLutCalcL0, 0, VP_HDR_KERNEL_NAME_L0_3DLUT, allocator)
+{
+    VP_FUNC_CALL();
+    m_kernelBinaryID = VP_ADV_KERNEL_BINARY_ID(kernelHdr3DLutCalcL0);
+    m_isAdvKernel    = true;
+}
+
+VpRenderHdr3DLutL0Kernel::~VpRenderHdr3DLutL0Kernel()
+{
+    MOS_SafeFreeMemory(m_curbe);
+    m_curbe = nullptr;
+}
+
+MOS_STATUS VpRenderHdr3DLutL0Kernel::Init(VpRenderKernel &kernel)
+{
+    VP_FUNC_CALL();
+
+    VP_RENDER_NORMALMESSAGE("Initializing SR krn %s", kernel.GetKernelName().c_str());
+
+    m_kernelSize = kernel.GetKernelSize();
+
+    uint8_t *pKernelBin = (uint8_t *)kernel.GetKernelBinPointer();
+    VP_RENDER_CHK_NULL_RETURN(pKernelBin);
+
+    m_kernelBinary = pKernelBin + kernel.GetKernelBinOffset();
+
+    m_kernelArgs = kernel.GetKernelArgs();
+
+    for (auto arg : m_kernelArgs)
+    {
+        arg.pData = nullptr;
+    }
+
+    m_kernelBtis = kernel.GetKernelBtis();
+
+    m_kernelEnv = kernel.GetKernelExeEnv();
+
+    m_curbeSize = kernel.GetCurbeSize();
+
+    return MOS_STATUS_SUCCESS;
+}
+
+
+MOS_STATUS VpRenderHdr3DLutL0Kernel::SetupSurfaceState()
+{
+    VP_FUNC_CALL();
+    VP_RENDER_CHK_STATUS_RETURN(InitCoefSurface(m_maxDisplayLum, m_maxContentLevelLum, m_hdrMode));
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS VpRenderHdr3DLutL0Kernel::CpPrepareResources()
+{
+    VP_FUNC_CALL();
+
+    PMOS_RESOURCE source[VPHAL_MAX_SOURCES] = {nullptr};
+    PMOS_RESOURCE target[VPHAL_MAX_TARGETS] = {nullptr};
+
+    if ((nullptr != m_hwInterface->m_osInterface) &&
+        (nullptr != m_hwInterface->m_osInterface->osCpInterface))
+    {
+        auto        it   = m_surfaceGroup->find(SurfaceType3DLutCoef);
+        VP_SURFACE *surf = (m_surfaceGroup->end() != it) ? it->second : nullptr;
+        VP_RENDER_CHK_NULL_RETURN(surf);
+        source[0] = &(surf->osSurface->OsResource);
+
+        it   = m_surfaceGroup->find(SurfaceType3DLut);
+        surf = (m_surfaceGroup->end() != it) ? it->second : nullptr;
+        VP_RENDER_CHK_NULL_RETURN(surf);
+
+        target[0] = &(surf->osSurface->OsResource);
+        m_hwInterface->m_osInterface->osCpInterface->PrepareResources((void **)source, 1, (void **)target, 1);
+    }
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS VpRenderHdr3DLutL0Kernel::SetupStatelessBuffer()
+{
+    VP_FUNC_CALL();
+    m_statelessArray.clear();
+    VP_RENDER_CHK_STATUS_RETURN(SetupStatelessBufferResource(SurfaceType3DLutCoef));
+    VP_RENDER_CHK_STATUS_RETURN(SetupStatelessBufferResource(SurfaceType3DLut));
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS VpRenderHdr3DLutL0Kernel::GetCurbeState(void *&curbe, uint32_t &curbeLength)
+{
+    VP_FUNC_CALL();
+    curbeLength = m_curbeSize;
+
+    VP_RENDER_NORMALMESSAGE("KernelID %d, Curbe Size %d\n", m_kernelId, curbeLength);
+    if (curbeLength == 0)
+    {
+        return MOS_STATUS_INVALID_PARAMETER;
+    }
+
+    uint8_t *pCurbe = (uint8_t *)MOS_AllocAndZeroMemory(curbeLength);
+    VP_RENDER_CHK_NULL_RETURN(pCurbe);
+    MOS_FreeMemAndSetNull(m_curbe);
+    m_curbe = pCurbe;
+
+    for (auto &arg : m_kernelArgs)
+    {
+        if (arg.eArgKind == ARG_KIND_GENERAL)
+        {
+            if (arg.pData != nullptr)
+            {
+                MOS_SecureMemcpy(pCurbe + arg.uOffsetInPayload, arg.uSize, arg.pData, arg.uSize);
+                VP_RENDER_NORMALMESSAGE("Setting Curbe State KernelID %d, index %d , value %d, argKind %d", m_kernelId, arg.uIndex, *(uint32_t *)arg.pData, arg.eArgKind);
+            }
+            else
+            {
+                VP_RENDER_NORMALMESSAGE("KernelID %d, index %d, argKind %d is empty", m_kernelId, arg.uIndex, arg.eArgKind);
+            }
+        }
+        else if (arg.eArgKind == ARG_KIND_SURFACE)
+        {
+            if (arg.addressMode == AddressingModeStateless && arg.pData != nullptr)
+            {
+                for (uint32_t idx = 0; idx < arg.uSize / sizeof(SurfaceType); idx++)
+                {
+                    uint32_t   *pSurfaceindex  = (uint32_t *)(arg.pData) + idx;
+                    SurfaceType surf           = (SurfaceType)*pSurfaceindex;
+
+                    if (surf != SurfaceTypeInvalid)
+                    {
+                        auto it = m_statelessArray.find(surf);
+                        uint64_t ui64GfxAddress                              = (m_statelessArray.end() != it) ? it->second : 0xFFFF;
+                        *((uint64_t *)(pCurbe + arg.uOffsetInPayload) + idx) = ui64GfxAddress;
+                        break;
+                    }
+                    else
+                    {
+                        *((uint64_t *)(pCurbe + arg.uOffsetInPayload) + idx) = 0xFFFF;
+                    }
+                }
+            }
+        }
+        else if (arg.eArgKind == ARG_KIND_INLINE)
+        {
+            VP_RENDER_NORMALMESSAGE("Skip inline data here");
+        }
+        else
+        {
+            return MOS_STATUS_UNIMPLEMENTED;
+        }
+    }
+
+    curbe = pCurbe;
+
+    return MOS_STATUS_SUCCESS;
+}
+
+
+MOS_STATUS VpRenderHdr3DLutL0Kernel::GetWalkerSetting(KERNEL_WALKER_PARAMS &walkerParam, KERNEL_PACKET_RENDER_DATA &renderData)
+{
+
+    VP_FUNC_CALL();
+
+    walkerParam = m_walkerParam;
+    walkerParam.iBindingTable = renderData.bindingTable;
+    walkerParam.iMediaID      = renderData.mediaID;
+    walkerParam.iCurbeOffset  = renderData.iCurbeOffset;
+    // Should use renderData.iCurbeLength instead of kernelSettings.CURBE_Length.
+    // kernelSettings.CURBE_Length is 32 aligned with 5 bits shift.
+    // renderData.iCurbeLength is RENDERHAL_CURBE_BLOCK_ALIGN(64) aligned.
+    walkerParam.iCurbeLength = renderData.iCurbeLength;
+    return MOS_STATUS_SUCCESS;
+}
+
+// Only for Adv kernels.
+MOS_STATUS VpRenderHdr3DLutL0Kernel::SetWalkerSetting(KERNEL_THREAD_SPACE &threadSpace, bool bSyncFlag, bool flushL1)
+{
+    VP_FUNC_CALL();
+    MOS_ZeroMemory(&m_walkerParam, sizeof(KERNEL_WALKER_PARAMS));
+
+    m_walkerParam.iBlocksX          = threadSpace.uWidth;
+    m_walkerParam.iBlocksY          = threadSpace.uHeight;
+    m_walkerParam.threadWidth       = threadSpace.uLocalWidth;
+    m_walkerParam.threadHeight      = threadSpace.uLocalHeight;
+    m_walkerParam.threadDepth       = 1;
+    m_walkerParam.isVerticalPattern = false;
+    m_walkerParam.bSyncFlag         = bSyncFlag;
+
+    m_walkerParam.pipeControlParams.bUpdateNeeded              = true;
+    m_walkerParam.pipeControlParams.bEnableDataPortFlush       = true;
+    m_walkerParam.pipeControlParams.bUnTypedDataPortCacheFlush = true;
+    m_walkerParam.pipeControlParams.bFlushRenderTargetCache    = false;
+    m_walkerParam.pipeControlParams.bInvalidateTextureCache    = false;
+
+    for (auto &arg : m_kernelArgs)
+    {
+        if (arg.eArgKind == ARG_KIND_INLINE)
+        {
+            if (arg.pData != nullptr)
+            {
+                MOS_SecureMemcpy(m_inlineData + arg.uOffsetInPayload, arg.uSize, arg.pData, arg.uSize);
+                VP_RENDER_NORMALMESSAGE("Setting Inline Data KernelID %d, index %d , value %d, argKind %d", m_kernelId, arg.uIndex, *(uint32_t *)arg.pData, arg.eArgKind);
+            }
+            else
+            {
+                VP_RENDER_NORMALMESSAGE("KernelID %d, index %d, argKind %d is empty", m_kernelId, arg.uIndex, arg.eArgKind);
+            }
+        }
+    }
+    m_walkerParam.inlineDataLength = sizeof(m_inlineData);
+    m_walkerParam.inlineData       = m_inlineData;
+
+    if (m_kernelEnv.uSimdSize != 1 &&
+        (m_kernelEnv.uiWorkGroupWalkOrderDimensions[0] != 0 ||
+            m_kernelEnv.uiWorkGroupWalkOrderDimensions[1] != 0 ||
+            m_kernelEnv.uiWorkGroupWalkOrderDimensions[2] != 0))
+    {
+        m_walkerParam.isEmitInlineParameter = true;
+        m_walkerParam.isGenerateLocalID     = true;
+        m_walkerParam.emitLocal             = MHW_EMIT_LOCAL_XYZ;
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS VpRenderHdr3DLutL0Kernel::InitCoefSurface(const uint32_t maxDLL, const uint32_t maxCLL, const VPHAL_HDR_MODE hdrMode)
+{
+    VP_FUNC_CALL();
+    float  *hdrcoefBuffer = nullptr;
+    int32_t oetfCurve = 0, tmMode = 0, tmSrcType = 0;
+    float   *ccmMatrix = m_ccmMatrix;
+    float   tmMaxCLL = 0.0f, tmMaxDLL = 0.0f;
+
+    MOS_ZeroMemory(m_ccmMatrix, sizeof(m_ccmMatrix));
+
+    // Get surface addr
+    auto        it   = m_surfaceGroup->find(SurfaceType3DLutCoef);
+    VP_SURFACE *surf = (m_surfaceGroup->end() != it) ? it->second : nullptr;
+    VP_RENDER_CHK_NULL_RETURN(surf);
+
+    tmMaxCLL = (float)maxCLL;
+    tmMaxDLL = (float)maxDLL;
+
+    // Lock surface
+    uint8_t *lockedAddr = (uint8_t *)m_allocator->LockResourceForWrite(&surf->osSurface->OsResource);
+
+    VP_RENDER_CHK_NULL_RETURN(lockedAddr);
+
+    hdrcoefBuffer = (float *)lockedAddr;
+
+    if (hdrMode == VPHAL_HDR_MODE_TONE_MAPPING)  // H2S
+    {
+        CalcCCMMatrix();
+        MOS_SecureMemcpy(ccmMatrix, sizeof(float) * 12, color_matrix_calculation, sizeof(float) * 12);
+
+        tmMode    = (TONE_MAPPING_MODE)TONE_MAPPING_MODE_H2S;
+        oetfCurve = (OETF_CURVE_TYPE)OETF_SRGB;
+        tmSrcType = (TONE_MAPPING_SOURCE_TYPE)TONE_MAPPING_SOURCE_PSEUDO_Y_BT709;
+    }
+    else  // H2H
+    {
+        MOS_SecureMemcpy(ccmMatrix, sizeof(float) * 12, ccm_identity, sizeof(float) * 12);
+
+        tmMode    = (TONE_MAPPING_MODE)TONE_MAPPING_MODE_H2H;
+        oetfCurve = (OETF_CURVE_TYPE)OETF_CURVE_HDR_2084;
+        tmSrcType = (TONE_MAPPING_SOURCE_TYPE)TONE_MAPPING_SOURCE_PSEUDO_Y_BT709;
+    }
+
+    // Fill Coefficient Surface: Media kernel define the layout of coefficients. Please don't change it.
+    const uint32_t pos_coef[17] = {7, 16, 17, 18, 19, 20, 21, 24, 25, 26, 27, 28, 29, 54, 55, 62, 63};
+
+    // OETF curve
+    ((int *)hdrcoefBuffer)[pos_coef[0]] = oetfCurve;
+    // CCM
+    for (uint32_t i = 0; i < VP_CCM_MATRIX_SIZE; ++i)
+    {
+        hdrcoefBuffer[pos_coef[i + 1]] = ccmMatrix[i];
+    }
+    // TM Source Type
+    ((int *)hdrcoefBuffer)[pos_coef[13]] = tmSrcType;
+    // TM Mode
+    ((int *)hdrcoefBuffer)[pos_coef[14]] = tmMode;
+    // Max CLL and DLL
+    hdrcoefBuffer[pos_coef[15]] = tmMaxCLL;
+    hdrcoefBuffer[pos_coef[16]] = tmMaxDLL;
+
+    //Unlock
+    VP_RENDER_CHK_STATUS_RETURN(m_allocator->UnLock(&surf->osSurface->OsResource));
+
+    return MOS_STATUS_SUCCESS;
+}
+
+MOS_STATUS VpRenderHdr3DLutL0Kernel::SetKernelConfigs(KERNEL_CONFIGS &kernelConfigs)
+{
+    VP_FUNC_CALL();
+    auto it = kernelConfigs.find((VpKernelID)kernelHdr3DLutCalcL0);
+
+    if (kernelConfigs.end() == it || nullptr == it->second)
+    {
+        VP_RENDER_CHK_STATUS_RETURN(MOS_STATUS_INVALID_PARAMETER);
+    }
+
+    PRENDER_HDR_3DLUT_CAL_PARAMS params = (PRENDER_HDR_3DLUT_CAL_PARAMS)it->second;
+
+    if (m_maxDisplayLum == params->maxDisplayLum && m_maxContentLevelLum == params->maxContentLevelLum &&
+        m_hdrMode == params->hdrMode && m_hdrLutSize == params->threadWidth)
+    {
+        // For such case, 3DLut calculation should be skipped in Policy::GetHdrExecutionCaps.
+        VP_RENDER_ASSERTMESSAGE("No change in 3D Lut parameters!");
+    }
+    else
+    {
+        m_maxDisplayLum      = params->maxDisplayLum;
+        m_maxContentLevelLum = params->maxContentLevelLum;
+        m_hdrMode            = params->hdrMode;
+        m_hdrLutSize         = params->threadWidth;
+        VP_RENDER_NORMALMESSAGE("Maximum Display Luminance %d, Maximum Content Level Luminance %d, HDR mode %d, Lut size %d",
+            m_maxDisplayLum,
+            m_maxContentLevelLum,
+            m_hdrMode,
+            m_hdrLutSize);
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+
+
+MOS_STATUS VpRenderHdr3DLutL0Kernel::SetKernelArgs(KERNEL_ARGS &kernelArgs, VP_PACKET_SHARED_CONTEXT *sharedContext)
+{
+    VP_FUNC_CALL();
+
+    //All pData will be free in VpSrFilter::Destroy so no need to free here
+    for (KRN_ARG &srcArg : kernelArgs)
+    {
+        for (KRN_ARG &dstArg : m_kernelArgs)
+        {
+            if (srcArg.uIndex == dstArg.uIndex)
+            {
+                if (dstArg.eArgKind == ARG_KIND_GENERAL || dstArg.eArgKind == ARG_KIND_INLINE || srcArg.eArgKind == ARG_KIND_SURFACE)
+                {
+                    if (srcArg.pData == nullptr)
+                    {
+                        VP_RENDER_ASSERTMESSAGE("The Kernel Argument General Data is null! KernelID %d, argIndex %d", m_kernelId, dstArg.uIndex);
+                        return MOS_STATUS_INVALID_PARAMETER;
+                    }
+                    else
+                    {
+                        dstArg.eArgKind = srcArg.eArgKind;
+                        dstArg.pData    = srcArg.pData;
+                        srcArg.pData    = nullptr;
+                    }
+                }
+            }
+        }
+
+        if (srcArg.pData != nullptr)
+        {
+            srcArg.pData = nullptr;
+            VP_RENDER_ASSERTMESSAGE("The Kernel Argument is set but not used. KernelID %d, argIndex %d", m_kernelId, srcArg.uIndex);
+        }
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
+void VpRenderHdr3DLutL0Kernel::DumpSurfaces()
+{
+    VP_FUNC_CALL();
+    for (auto &arg : m_kernelArgs)
+    {
+        if (arg.eArgKind == ARG_KIND_SURFACE)
+        {
+            for (uint32_t idx = 0; idx < arg.uSize / (sizeof(SurfaceType) * 2); idx++)
+            {
+                uint32_t   *pSurfaceindex = (uint32_t *)(arg.pData) + idx;
+                SurfaceType surfType      = (SurfaceType)*pSurfaceindex;
+                if (surfType == SurfaceTypeInvalid)
+                {
+                    VP_RENDER_ASSERTMESSAGE("Surf type was invalid");
+                    return;
+                }
+                auto surf = m_surfaceGroup->find(surfType);
+                if (m_surfaceGroup->end() == surf)
+                {
+                    VP_RENDER_ASSERTMESSAGE("Surf was not found");
+                    return;
+                }
+
+                char bufName[MAX_PATH] = {};
+
+                MOS_SecureStringPrint(
+                    bufName,
+                    MAX_PATH,
+                    sizeof(bufName),
+                    "k_%d_%s_argi_%d",
+                    m_kernelIndex,
+                    m_kernelName.c_str(),
+                    idx);
+
+                if (surf->second == nullptr)
+                {
+                    return;
+                }
+                if (surf->second->osSurface == nullptr)
+                {
+                    return;
+                }
+
+                DumpSurface(surf->second, bufName);
+
+            }
+        }
+    }
+
+    return;
+}
\ No newline at end of file
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_render_vebox_hdr_3dlut_l0_kernel.h b/media_softlet/agnostic/common/vp/hal/packet/vp_render_vebox_hdr_3dlut_l0_kernel.h
new file mode 100644
index 0000000..69f0056
--- /dev/null
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_render_vebox_hdr_3dlut_l0_kernel.h
@@ -0,0 +1,91 @@
+/*
+* Copyright (c) 2024, Intel Corporation
+*
+* Permission is hereby granted, free of charge, to any person obtaining a
+* copy of this software and associated documentation files (the "Software"),
+* to deal in the Software without restriction, including without limitation
+* the rights to use, copy, modify, merge, publish, distribute, sublicense,
+* and/or sell copies of the Software, and to permit persons to whom the
+* Software is furnished to do so, subject to the following conditions:
+*
+* The above copyright notice and this permission notice shall be included
+* in all copies or substantial portions of the Software.
+*
+* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+* OTHER DEALINGS IN THE SOFTWARE.
+*/
+#ifndef __VP_RENDER_VEBOX_HDR_3DLUT_L0_KERNEL_H__
+#define __VP_RENDER_VEBOX_HDR_3DLUT_L0_KERNEL_H__
+
+#include "vp_render_cmd_packet.h"
+#include "vp_render_vebox_hdr_3dlut_kernel.h"
+#define VP_HDR_KERNEL_NAME_L0_3DLUT "fillLutTable_3dlut"
+namespace vp
+{
+//!
+//! \brief    Tone Mapping Source Type, Please don't change the Enmu Value.
+//! \details  These Enmu Values are passed to media kernel for further processing.
+//!
+
+class VpRenderHdr3DLutL0Kernel : public VpRenderKernelObj
+{
+public:
+    VpRenderHdr3DLutL0Kernel(PVP_MHWINTERFACE hwInterface, PVpAllocator allocator);
+    virtual ~VpRenderHdr3DLutL0Kernel();
+
+    virtual MOS_STATUS Init(VpRenderKernel& kernel);
+    virtual MOS_STATUS GetCurbeState(void *&curbe, uint32_t &curbeLength) override;
+
+    virtual MOS_STATUS FreeCurbe(void*& curbe) override
+    {
+        return MOS_STATUS_SUCCESS;
+    }
+
+    virtual uint32_t   GetInlineDataSize() override
+    {
+        return 0;
+    }
+
+    virtual bool IsKernelCached() override
+    {
+        return true;
+    }
+    virtual MOS_STATUS GetWalkerSetting(KERNEL_WALKER_PARAMS &walkerParam, KERNEL_PACKET_RENDER_DATA &renderData) override;
+    virtual MOS_STATUS InitCoefSurface(const uint32_t maxDLL, const uint32_t maxCLL, const VPHAL_HDR_MODE hdrMode);
+
+protected:
+    virtual MOS_STATUS SetupSurfaceState() override;
+    virtual MOS_STATUS CpPrepareResources() override;
+    virtual MOS_STATUS SetupStatelessBuffer() override;
+    virtual MOS_STATUS SetWalkerSetting(KERNEL_THREAD_SPACE &threadSpace, bool bSyncFlag, bool flushL1 = false);
+    virtual MOS_STATUS SetKernelArgs(KERNEL_ARGS &kernelArgs, VP_PACKET_SHARED_CONTEXT *sharedContext);
+    virtual MOS_STATUS SetKernelConfigs(KERNEL_CONFIGS &kernelConfigs) override;
+    virtual void       DumpSurfaces();
+
+    //kernel Arguments
+    KERNEL_ARGS          m_kernelArgs  = {};
+    KERNEL_WALKER_PARAMS m_walkerParam = {};
+    uint8_t              m_inlineData[32] = {};
+
+    float           m_ccmMatrix[VP_CCM_MATRIX_SIZE] = {0.0};
+    uint32_t        m_maxDisplayLum         = 1000;         //!< Maximum Display Luminance
+    uint32_t        m_maxContentLevelLum    = 4000;         //!< Maximum Content Level Luminance
+    VPHAL_HDR_MODE  m_hdrMode               = VPHAL_HDR_MODE_NONE;
+    uint32_t        m_hdrLutSize            = LUT65_SEG_SIZE;
+    void*           m_curbe                 = nullptr;
+    uint32_t        m_curbeSize              = 0;
+    KERNEL_BTIS                  m_kernelBtis                    = {};
+    KRN_EXECUTE_ENV              m_kernelEnv                     = {};
+    KERNEL_ARG_INDEX_SURFACE_MAP m_argIndexSurfMap  = {};
+
+    MEDIA_CLASS_DEFINE_END(vp__VpRenderHdr3DLutL0Kernel)
+};
+
+}  // namespace vp
+
+#endif //__RENDER_VEBOX_HDR_3DLUT_L0_KERNEL__
\ No newline at end of file
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 4aedf5b..14a3c44 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
@@ -125,6 +125,62 @@
     return MOS_STATUS_SUCCESS;
 }
 
+MOS_STATUS VpVeboxCmdPacket::SetupVeboxExternal3DLutforHDR(
+    mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams)
+{
+    VP_RENDER_NORMALMESSAGE("Init 3DLut table surface by external API.");
+    PMHW_VEBOX_MODE    pVeboxMode   = nullptr;
+    PMHW_VEBOX_3D_LUT  pLUT3D       = nullptr;
+    PMHW_3DLUT_PARAMS  external3DLutParams = nullptr;
+    PMOS_INTERFACE     osInterface  = nullptr;
+    VpVeboxRenderData *pRenderData  = GetLastExecRenderData();
+    external3DLutParams                    = &(pRenderData->GetIECPParams().s3DLutParams);
+
+    VP_RENDER_CHK_NULL_RETURN(m_surfMemCacheCtl);
+    VP_RENDER_CHK_NULL_RETURN(pRenderData);
+
+    VP_PUBLIC_CHK_NULL_RETURN(external3DLutParams);
+    VP_PUBLIC_CHK_NULL_RETURN(m_hwInterface->m_osInterface);
+    osInterface = m_hwInterface->m_osInterface;
+
+    pVeboxMode = &veboxStateCmdParams.VeboxMode;
+    pLUT3D     = &veboxStateCmdParams.LUT3D;
+
+    VP_PUBLIC_CHK_NULL_RETURN(pLUT3D);
+    pLUT3D->ArbitrationPriorityControl    = 0;
+    pLUT3D->Lut3dEnable                   = true;
+    pVeboxMode->ColorGamutExpansionEnable = true;
+
+    pLUT3D->Lut3dSize = 0;
+    switch (external3DLutParams->LUTSize)
+    {
+    case 17:
+        pLUT3D->Lut3dSize = 1;
+        break;
+    case 65:
+        pLUT3D->Lut3dSize = 2;
+        break;
+    case 45:
+        pLUT3D->Lut3dSize = 3;
+        break;
+    case 33:
+    default:
+        pLUT3D->Lut3dSize = 0;
+        break;
+    }
+    VP_RENDER_CHK_STATUS_RETURN(osInterface->pfnRegisterResource(
+        osInterface,
+        &(pRenderData->HDR3DLUT.external3DLutSurfResource),
+        false,
+        true));
+
+    veboxStateCmdParams.Vebox3DLookUpTablesSurfCtrl.Value =
+        m_surfMemCacheCtl->DnDi.Vebox3DLookUpTablesSurfMemObjCtl;
+    veboxStateCmdParams.pVebox3DLookUpTables = &(pRenderData->HDR3DLUT.external3DLutSurfResource);
+
+    return MOS_STATUS_SUCCESS;
+}
+
 MOS_STATUS VpVeboxCmdPacket::SetupVebox3DLutForHDR(
     mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams)
 {
@@ -169,6 +225,13 @@
     VpVeboxRenderData *renderData = GetLastExecRenderData();
     VP_RENDER_CHK_NULL_RETURN(renderData);
 
+    if (renderData->HDR3DLUT.isExternal3DLutTable)
+    {
+        VP_RENDER_CHK_STATUS_RETURN(SetupVeboxExternal3DLutforHDR(veboxStateCmdParams));
+        VP_PUBLIC_NORMALMESSAGE("3DLUT table setup by API.");
+        return MOS_STATUS_SUCCESS;
+    }
+
     if (renderData->HDR3DLUT.bHdr3DLut)
     {
         VP_RENDER_CHK_STATUS_RETURN(SetupVebox3DLutForHDR(veboxStateCmdParams));
@@ -1057,6 +1120,7 @@
     VP_PUBLIC_CHK_NULL_RETURN(hdrParams);
     VP_RENDER_ASSERT(pRenderData);
 
+    MHW_VEBOX_IECP_PARAMS  &mhwVeboxIecpParams  = pRenderData->GetIECPParams();
     MHW_VEBOX_GAMUT_PARAMS &mhwVeboxGamutParams = pRenderData->GetGamutParams();
     pOsInterface                       = m_hwInterface->m_osInterface;
     pRenderData->HDR3DLUT.bHdr3DLut    = true;
@@ -1064,13 +1128,16 @@
     pRenderData->HDR3DLUT.is3DLutTableFilled   = HDR_STAGE::HDR_STAGE_VEBOX_3DLUT_UPDATE == hdrParams->stage ||
                                                     HDR_STAGE::HDR_STAGE_VEBOX_3DLUT_NO_UPDATE == hdrParams->stage;
     pRenderData->HDR3DLUT.is3DLutTableUpdatedByKernel = HDR_STAGE::HDR_STAGE_VEBOX_3DLUT_UPDATE == hdrParams->stage;
+    pRenderData->HDR3DLUT.isExternal3DLutTable    = HDR_STAGE::HDR_STAGE_VEBOX_EXTERNAL_3DLUT == hdrParams->stage;
     pRenderData->HDR3DLUT.uiMaxDisplayLum      = hdrParams->uiMaxDisplayLum;
     pRenderData->HDR3DLUT.uiMaxContentLevelLum = hdrParams->uiMaxContentLevelLum;
     pRenderData->HDR3DLUT.hdrMode              = hdrParams->hdrMode;
     pRenderData->HDR3DLUT.uiLutSize            = hdrParams->lutSize;
 
-    VP_RENDER_CHK_STATUS_RETURN(ValidateHDR3DLutParameters(pRenderData->HDR3DLUT.is3DLutTableFilled));
-
+    if (!(hdrParams->stage == HDR_STAGE_VEBOX_EXTERNAL_3DLUT))
+    {
+        VP_RENDER_CHK_STATUS_RETURN(ValidateHDR3DLutParameters(pRenderData->HDR3DLUT.is3DLutTableFilled));
+    }
     // Use Gamut
     mhwVeboxGamutParams.ColorSpace       = VpHalCspace2MhwCspace(hdrParams->srcColorSpace);
     mhwVeboxGamutParams.dstColorSpace    = VpHalCspace2MhwCspace(hdrParams->dstColorSpace);
@@ -1089,9 +1156,29 @@
         mhwVeboxGamutParams.uiMaxCLL = 0;
     }
 
-    MHW_VEBOX_IECP_PARAMS &mhwVeboxIecpParams = pRenderData->GetIECPParams();
     mhwVeboxIecpParams.s3DLutParams.bActive   = true;
 
+    if (hdrParams->isFp16Enable)
+    {
+        // When FP16 enable, it doesn't need Pre CSC, so set GammaCorr and H2S false.
+        mhwVeboxGamutParams.bGammaCorr          = false;
+        mhwVeboxGamutParams.bH2S                = false;
+        mhwVeboxIecpParams.fp16Params.isActive  = true;
+    }
+
+    if (hdrParams->stage == HDR_STAGE_VEBOX_EXTERNAL_3DLUT)
+    {
+        if (hdrParams->external3DLutParams)
+        {
+            mhwVeboxIecpParams.s3DLutParams.LUTSize = hdrParams->external3DLutParams->LutSize;
+            pRenderData->HDR3DLUT.external3DLutSurfResource = hdrParams->external3DLutParams->pExt3DLutSurface->OsResource;
+        }
+        else
+        {
+            VP_RENDER_ASSERTMESSAGE("hdrParams external3DLutParams is null.");
+        }
+    }
+
     //Report
     if (m_hwInterface->m_reporting)
     {
@@ -2976,12 +3063,18 @@
             break;
 
         CASE_RGB32_FORMAT:
+            *pPerfTag = VPHAL_VEBOX_RGB32;
+            break;
+
         case Format_AYUV:
+            *pPerfTag = VPHAL_VEBOX_AYUV;
+            break;
+
         case Format_A16B16G16R16:
         case Format_A16R16G16B16:
         case Format_A16B16G16R16F:
         case Format_A16R16G16B16F:
-            *pPerfTag = VPHAL_NONE;
+            *pPerfTag = VPHAL_VEBOX_RGB64;
             break;
 
         default:
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 7b0e512..ffff170 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
@@ -930,6 +930,7 @@
     uint32_t curNoiseLevelV_Temporal      = 0;  //!< Temporal Noise Level for V
     bool     m_bTgneEnable                = true;
     bool     m_bTgneValid                 = false;
+    bool     m_bFallback                  = false;
 
     mhw::vebox::MHW_VEBOX_CHROMA_PARAMS veboxChromaParams = {};
 
@@ -1124,6 +1125,8 @@
     void    UpdateCpPrepareResources();
     virtual MOS_STATUS SetupVebox3DLutForHDR(
         mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams);
+    virtual MOS_STATUS SetupVeboxExternal3DLutforHDR(
+        mhw::vebox::VEBOX_STATE_PAR &veboxStateCmdParams);
 
 private:
 
diff --git a/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_common.h b/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_common.h
index 7fdbbae..0b38de0 100644
--- a/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_common.h
+++ b/media_softlet/agnostic/common/vp/hal/packet/vp_vebox_common.h
@@ -162,10 +162,12 @@
             bool           bUseVEHdrSfc;          //!< Use SFC to perform CSC/Scaling for HDR content
             bool           is3DLutTableFilled;    //!< 3DLut is filled by kernel/
             bool           is3DLutTableUpdatedByKernel;  //!< 3DLut is updated by kernel/
+            bool           isExternal3DLutTable;     //!< 3DLut is updated by API/
             uint32_t       uiMaxDisplayLum;              //!< Maximum Display Luminance
             uint32_t       uiMaxContentLevelLum;         //!< Maximum Content Level Luminance
             VPHAL_HDR_MODE hdrMode;
             uint32_t       uiLutSize;
+            MOS_RESOURCE   external3DLutSurfResource;
         };
     } HDR3DLUT;
     struct
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 a727141..e37ec77 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
@@ -72,6 +72,7 @@
         uint8_t                       rtCacheSetting      = 0;                            //!< Render Target cache usage
 #if (_DEBUG || _RELEASE_INTERNAL)
         uint8_t                       rtOldCacheSetting   = 0;                            //!< Render Target old cache usage
+        bool                          isL03DLut           = false;
 #endif
         bool                          VeboxScalability    = false;                        //!< Vebox Scalability flag
         bool                          VPApogeios          = false;                        //!< VP Apogeios flag
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 d8613c9..669e26e 100644
--- a/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.cpp
+++ b/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2018-2023, Intel Corporation
+* Copyright (c) 2018-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -218,6 +218,15 @@
             {
                 m_reporting->GetFeatures().rtOldCacheSetting = (uint8_t)(m_vpMhwInterface.m_renderHal->oldCacheSettingForTargetSurface);
             }
+            if (m_reporting->GetFeatures().isL03DLut)
+            {
+                VP_PUBLIC_NORMALMESSAGE("VP L0 3DLut Enabled");
+                ReportUserSettingForDebug(
+                    m_userSettingPtr,
+                    __MEDIA_USER_FEATURE_VALUE_VP_L0_3DLUT_ENABLED,
+                    1,
+                    MediaUserSetting::Group::Sequence);
+            }
 #endif
         }
 
@@ -359,6 +368,14 @@
         VP_PUBLIC_NORMALMESSAGE("Create GpuContext for Compute/Render (PacketId: %d).", packetId);
         VP_PUBLIC_CHK_STATUS_RETURN(PacketPipe::SwitchContext(packetId, m_scalability,
             m_mediaContext, MOS_VE_SUPPORTED(m_osInterface), m_numVebox));
+
+        // create SinglePipe GpuContext for multi Vebox system to avoid first frame long latency issue
+        if (m_numVebox > 1 && !(m_vpSettings && m_vpSettings->clearVideoViewMode))
+        {
+            VP_PUBLIC_NORMALMESSAGE("Create Single Pipe GpuContext for Vebox.");
+            VP_PUBLIC_CHK_STATUS_RETURN(PacketPipe::SwitchContext(VP_PIPELINE_PACKET_VEBOX, m_scalability,
+                m_mediaContext, MOS_VE_SUPPORTED(m_osInterface), 1));
+        }
     }
 
     return MOS_STATUS_SUCCESS;
@@ -398,8 +415,9 @@
         VP_PUBLIC_CHK_STATUS_RETURN(MOS_STATUS_INVALID_PARAMETER);
     }
 
-    MT_LOG2(MT_VP_FEATURE_GRAPH_EXECUTE_VPPIPELINE_START, MT_NORMAL, MT_VP_FEATURE_GRAPH_FILTER_SWFILTERPIPE_COUNT, (int64_t)swFilterPipes.size(), MT_VP_FEATURE_GRAPH_FILTER_FRAMEID,m_vpPipeContexts[0]->GetFrameCounter());
-    VP_PUBLIC_NORMALMESSAGE("Feature Graph: Execute VP Pipeline Start, swfilter count:%d, frameid:%d", (int64_t)swFilterPipes.size(), m_vpPipeContexts[0]->GetFrameCounter());
+    MT_LOG1(MT_VP_FEATURE_GRAPH_EXECUTE_VPPIPELINE_START, MT_NORMAL,
+            MT_VP_FEATURE_GRAPH_FILTER_SWFILTERPIPE_COUNT, (int64_t)swFilterPipes.size());
+    VP_PUBLIC_NORMALMESSAGE("Feature Graph: Execute VP Pipeline Start, swfilterPipes count:%d", (int64_t)swFilterPipes.size());
 
     if (PIPELINE_PARAM_TYPE_LEGACY == m_pvpParams.type)
     {
@@ -430,13 +448,16 @@
         VP_PUBLIC_CHK_STATUS_RETURN(eStatus);
         if (isBypassNeeded)
         {
-            MT_LOG3(MT_VP_FEATURE_GRAPH_EXECUTE_VPPIPELINE_END, MT_NORMAL, MT_VP_FEATURE_GRAPH_FILTER_SWFILTERPIPE_COUNT, (int64_t)swFilterPipes.size(),
-                    MT_VP_FEATURE_GRAPH_FILTER_FRAMEID, m_vpPipeContexts[0]->GetFrameCounter(), MT_VP_FEATURE_GRAPH_FILTER_PIPELINEBYPASS, isBypassNeeded);
-            VP_PUBLIC_NORMALMESSAGE("Feature Graph: Execute VP Pipeline End, swfilter count:%d, frameid:%d", (int64_t)swFilterPipes.size(), m_vpPipeContexts[0]->GetFrameCounter());
+            MT_LOG2(MT_VP_FEATURE_GRAPH_EXECUTE_VPPIPELINE_END, MT_NORMAL, 
+                    MT_VP_FEATURE_GRAPH_FILTER_SWFILTERPIPE_COUNT, (int64_t)swFilterPipes.size(),
+                    MT_VP_FEATURE_GRAPH_FILTER_PIPELINEBYPASS, isBypassNeeded);
+            VP_PUBLIC_NORMALMESSAGE("Feature Graph: Execute VP Pipeline End, swfilterPipes count:%d, isBypassNeeded:%d",
+                                     (int64_t)swFilterPipes.size(),
+                                     isBypassNeeded);
             return MOS_STATUS_SUCCESS;
         }
     }
-
+    VP_PUBLIC_CHK_STATUS_RETURN(UpdateFrameTracker());
     VP_PUBLIC_CHK_STATUS_RETURN(CreateSwFilterPipe(m_pvpParams, swFilterPipes));
 
     // Increment frame ID for performance measurement
@@ -444,32 +465,41 @@
 
     for (uint32_t pipeIdx = 0; pipeIdx < swFilterPipes.size(); pipeIdx++)
     {
-        MT_LOG3(MT_VP_FEATURE_GRAPH_EXECUTE_SINGLE_VPPIPELINE_START, MT_NORMAL, MT_VP_FEATURE_GRAPH_FILTER_SWFILTERPIPE_COUNT, (int64_t)swFilterPipes.size(),
-                MT_VP_FEATURE_GRAPH_FILTER_FRAMEID, m_vpPipeContexts[0]->GetFrameCounter(), MT_VP_FEATURE_GRAPH_FILTER_PIPEID, pipeIdx);
-        VP_PUBLIC_NORMALMESSAGE("Feature Graph: Execute VP Single Pipeline Start, swfilter count:%d, frameid:%d, pipeid:%d", (int64_t)swFilterPipes.size(), m_vpPipeContexts[0]->GetFrameCounter(), pipeIdx);
         auto &pipe = swFilterPipes[pipeIdx];
-        if (pipe)
-        {
-            pipe->AddRTLog();
-        }
         if (pipeIdx >= m_vpPipeContexts.size())
         {
             VP_PUBLIC_CHK_STATUS_RETURN(CreateSinglePipeContext());
         }
-
+        MT_LOG2(MT_VP_FEATURE_GRAPH_EXECUTE_SINGLE_VPPIPELINE_START, MT_NORMAL,
+                MT_VP_FEATURE_GRAPH_FILTER_FRAMEID, m_vpPipeContexts[pipeIdx]->GetFrameCounter(),
+                MT_VP_FEATURE_GRAPH_FILTER_PIPEID, pipeIdx);
+        VP_PUBLIC_NORMALMESSAGE("Feature Graph: Execute VP Single Pipeline Start, frameid:%d, pipeid:%d",
+                                 m_vpPipeContexts[pipeIdx]->GetFrameCounter(),
+                                 pipeIdx);
+        if (pipe)
+        {
+            pipe->AddRTLog();
+        }
         auto &singlePipeCtx = m_vpPipeContexts[pipeIdx];
         VP_PUBLIC_CHK_NULL_RETURN(singlePipeCtx->GetVpResourceManager());
         VP_PUBLIC_CHK_STATUS_RETURN(m_vpInterface->SwitchResourceManager(singlePipeCtx->GetVpResourceManager()));
 
         VP_PUBLIC_CHK_STATUS_RETURN(ExecuteSingleswFilterPipe(singlePipeCtx, pipe, pPacketPipe, featureManagerNext));
-        MT_LOG3(MT_VP_FEATURE_GRAPH_EXECUTE_SINGLE_VPPIPELINE_END, MT_NORMAL, MT_VP_FEATURE_GRAPH_FILTER_SWFILTERPIPE_COUNT, (int64_t)swFilterPipes.size(),
-                MT_VP_FEATURE_GRAPH_FILTER_FRAMEID, m_vpPipeContexts[0]->GetFrameCounter() - 1, MT_VP_FEATURE_GRAPH_FILTER_PIPEID, pipeIdx);
-        VP_PUBLIC_NORMALMESSAGE("Feature Graph: Execute VP Single Pipeline End, swfilter count:%d, frameid:%d, pipeid:%d", (int64_t)swFilterPipes.size(), m_vpPipeContexts[0]->GetFrameCounter() - 1, pipeIdx);
+        // FrameCounter will be increased inside ExecuteSingleswFilterPipe, so m_vpPipeContexts[pipeIdx]->GetFrameCounter() - 1 is needed.
+        MT_LOG2(MT_VP_FEATURE_GRAPH_EXECUTE_SINGLE_VPPIPELINE_END, MT_NORMAL,
+                MT_VP_FEATURE_GRAPH_FILTER_FRAMEID, m_vpPipeContexts[pipeIdx]->GetFrameCounter() - 1,
+                MT_VP_FEATURE_GRAPH_FILTER_PIPEID, pipeIdx);
+        VP_PUBLIC_NORMALMESSAGE("Feature Graph: Execute VP Single Pipeline End, frameid:%d, pipeid:%d",
+                                 m_vpPipeContexts[pipeIdx]->GetFrameCounter() - 1,
+                                 pipeIdx);
     }
 
-    MT_LOG3(MT_VP_FEATURE_GRAPH_EXECUTE_VPPIPELINE_END, MT_NORMAL, MT_VP_FEATURE_GRAPH_FILTER_SWFILTERPIPE_COUNT, (int64_t)swFilterPipes.size(),
-            MT_VP_FEATURE_GRAPH_FILTER_FRAMEID, m_vpPipeContexts[0]->GetFrameCounter() - 1, MT_VP_FEATURE_GRAPH_FILTER_PIPELINEBYPASS, isBypassNeeded);
-    VP_PUBLIC_NORMALMESSAGE("Feature Graph: Execute VP Pipeline End, swfilter count:%d, frameid:%d, isBypassNeeded:%d", (int64_t)swFilterPipes.size(), m_vpPipeContexts[0]->GetFrameCounter() - 1, isBypassNeeded);
+    MT_LOG2(MT_VP_FEATURE_GRAPH_EXECUTE_VPPIPELINE_END, MT_NORMAL,
+            MT_VP_FEATURE_GRAPH_FILTER_SWFILTERPIPE_COUNT, (int64_t)swFilterPipes.size(),
+            MT_VP_FEATURE_GRAPH_FILTER_PIPELINEBYPASS, isBypassNeeded);
+    VP_PUBLIC_NORMALMESSAGE("Feature Graph: Execute VP Pipeline End, swfilterPipes count:%d, isBypassNeeded:%d",
+                             (int64_t)swFilterPipes.size(),
+                             isBypassNeeded);
     return eStatus;
 }
 
@@ -637,6 +667,15 @@
     return MOS_STATUS_SUCCESS;
 }
 
+MOS_STATUS VpPipeline::UpdateFrameTracker()
+{
+    VP_FUNC_CALL();
+
+    VP_PUBLIC_CHK_NULL_RETURN(m_vpMhwInterface.m_vpPlatformInterface);
+    VP_PUBLIC_CHK_STATUS_RETURN(m_vpMhwInterface.m_vpPlatformInterface->InitFrameTracker());
+    return MOS_STATUS_SUCCESS;
+}
+
 MOS_STATUS VpPipeline::UpdateVeboxNumberforScalability()
 {
     VP_FUNC_CALL();
diff --git a/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.h b/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.h
index 0c368c6..ed99ac0 100644
--- a/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.h
+++ b/media_softlet/agnostic/common/vp/hal/pipeline/vp_pipeline.h
@@ -366,6 +366,8 @@
         return MOS_STATUS_SUCCESS;
     }
 
+    virtual MOS_STATUS UpdateFrameTracker();
+
 #if (_DEBUG || _RELEASE_INTERNAL)
     //!
     //! \brief  Report INTER_FRAME_MEMORY_NINJA_START_COUNTER and INTER_FRAME_MEMORY_NINJA_END_COUNTER
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 c83f617..6a4c1c5 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
@@ -225,7 +225,14 @@
     pStatusTable = &m_statusTable;
     uiNewHead    = pStatusTable->uiHead;  // uiNewHead start from previous head value
     // entry length from head to tail
-    uiTableLen = (pStatusTable->uiCurrent - pStatusTable->uiHead) & (VPHAL_STATUS_TABLE_MAX_SIZE - 1);
+    if (pStatusTable->uiCurrent < pStatusTable->uiHead)
+    {
+        uiTableLen = pStatusTable->uiCurrent + VPHAL_STATUS_TABLE_MAX_SIZE - pStatusTable->uiHead;
+    }
+    else
+    {
+        uiTableLen = pStatusTable->uiCurrent - pStatusTable->uiHead;
+    }
 
     // step 1 - update pStatusEntry from driver if command associated with the dwTag is done by gpu
     for (i = 0; i < wStatusNum && i < uiTableLen; i++)
@@ -326,7 +333,15 @@
     pStatusTable = &m_statusTable;
 
     // entry length from head to tail
-    *puiLength = (pStatusTable->uiCurrent - pStatusTable->uiHead) & (VPHAL_STATUS_TABLE_MAX_SIZE - 1);
+    if (pStatusTable->uiCurrent < pStatusTable->uiHead)
+    {
+        *puiLength = pStatusTable->uiCurrent + VPHAL_STATUS_TABLE_MAX_SIZE - pStatusTable->uiHead;
+    }
+    else
+    {
+        *puiLength = pStatusTable->uiCurrent - pStatusTable->uiHead;
+    }
+    
 finish:
 #else
     MOS_UNUSED(puiLength);
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 543aeb0..f7678ed 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
@@ -182,6 +182,7 @@
             uint64_t bColorBalance  : 1;
             uint64_t b1K1DLutInUse  : 1;
             uint64_t bCcmCsc        : 1;
+            uint64_t bDemosaicInUse : 1;
 
             // SFC features
             uint64_t bSfcCsc        : 1;   // Sfc Csc enabled
@@ -222,6 +223,7 @@
             uint64_t bt2020ToRGB : 1;           // true if bt2020 to rgb
             uint64_t is1K1DLutSurfaceInUse : 1;  // 1K1DLut surface in use
             uint64_t isHdr33LutSizeEnabled : 1;
+            uint64_t isBayerInputInUse : 1;
 
             // set by GetXxxPipeEnginCaps
             uint64_t bypassIfVeboxSfcInUse : 1;  // Bypass the feature if vebox or sfc in use. In such case, VeboxNeeded and
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 fc93cd7..edb6387 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
@@ -546,6 +546,12 @@
     {
         m_vpDelayLoadedNativeFunctionSet.clear();
     }
+
+    if (m_frameTracker)
+    {
+        MOS_Delete(m_frameTracker);
+    }
+
 }
 
 MOS_STATUS VpPlatformInterface::GetKernelParam(VpKernelID kernlId, RENDERHAL_KERNEL_PARAM &param)
@@ -719,8 +725,8 @@
 
     vpKernel.SetKernelBinPointer((void *)kernelBin);
     vpKernel.SetKernelName(kernelName);
-    vpKernel.SetKernelBinOffset(0x0);
-    vpKernel.SetKernelBinSize(kernelBinSize);
+    vpKernel.SetKernelBinOffset(kernelExeEnv.uOffsetToSkipPerThreadDataLoad);
+    vpKernel.SetKernelBinSize(kernelBinSize - kernelExeEnv.uOffsetToSkipPerThreadDataLoad);
     vpKernel.SetKernelExeEnv(kernelExeEnv);
     vpKernel.SetKernelCurbeSize(kernelCurbeSize);
 
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 7857fdd..1648b1d 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
@@ -32,6 +32,7 @@
 #include "vp_render_common.h"
 #include "vp_kernel_config.h"
 #include "media_copy.h"
+#include "vp_frametracker.h"
 
 namespace vp
 {
@@ -405,6 +406,16 @@
 
     void DisableRender();
 
+    virtual int GetModelConfig(int eu, int width, int height)
+    {
+        return 0;
+    };
+
+    virtual MOS_STATUS InitFrameTracker()
+    {
+        return MOS_STATUS_SUCCESS;
+    }
+
 protected:
     PMOS_INTERFACE m_pOsInterface = nullptr;
     VP_KERNEL_BINARY m_vpKernelBinary = {};                 //!< vp kernels
@@ -428,6 +439,7 @@
     std::map<DelayLoadedKernelType, DelayLoadedFunc> m_vpDelayLoadedNativeFunctionSet;
 
     bool m_isRenderDisabled = false;
+    VpFrameTracker *m_frameTracker     = nullptr;
 
     MEDIA_CLASS_DEFINE_END(vp__VpPlatformInterface)
 };
diff --git a/media_softlet/agnostic/common/vp/hal/shared/scalability/vp_scalability_multipipe_next.cpp b/media_softlet/agnostic/common/vp/hal/shared/scalability/vp_scalability_multipipe_next.cpp
index af750ae..7846a71 100644
--- a/media_softlet/agnostic/common/vp/hal/shared/scalability/vp_scalability_multipipe_next.cpp
+++ b/media_softlet/agnostic/common/vp/hal/shared/scalability/vp_scalability_multipipe_next.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2020-2023, Intel Corporation
+* Copyright (c) 2020-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -75,12 +75,29 @@
     allocParamsForBufferLinear.dwBytes  = VP_SEMAPHORE_COUNT * sizeof(uint32_t);
     allocParamsForBufferLinear.pBufName = "Sync All Pipes SemaphoreMemory";
 
-    memset(&m_resSemaphoreAllPipes, 0, sizeof(MOS_RESOURCE));
-    SCALABILITY_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource(
-                                              m_osInterface,
-                                              &allocParamsForBufferLinear,
-                                              &m_resSemaphoreAllPipes),
-        "Cannot create HW semaphore for scalability all pipes sync.");
+    for (uint32_t i = 0; i < 2; i++)
+    {
+        memset(&m_resSemaphoreAllPipes[i], 0, sizeof(MOS_RESOURCE));
+        SCALABILITY_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource(
+                                                  m_osInterface,
+                                                  &allocParamsForBufferLinear,
+                                                  &m_resSemaphoreAllPipes[i]),
+            "Cannot create HW semaphore for scalability all pipes sync.");
+
+        MOS_LOCK_PARAMS lockFlagsWriteOnly;
+        MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS));
+        lockFlagsWriteOnly.WriteOnly = 1;
+
+        uint32_t *data = (uint32_t *)m_osInterface->pfnLockResource(
+            m_osInterface,
+            &m_resSemaphoreAllPipes[i],
+            &lockFlagsWriteOnly);
+        SCALABILITY_CHK_NULL_RETURN(data);
+        MOS_ZeroMemory(data, VP_SEMAPHORE_COUNT * sizeof(uint32_t));
+        SCALABILITY_CHK_STATUS_RETURN(m_osInterface->pfnUnlockResource(
+            m_osInterface,
+            &m_resSemaphoreAllPipes[i]));
+    }
     memset(&m_resSemaphoreOnePipeWait, 0, sizeof(MOS_RESOURCE));
     SCALABILITY_CHK_STATUS_MESSAGE_RETURN(m_osInterface->pfnAllocateResource(
                                               m_osInterface,
@@ -201,7 +218,8 @@
         MOS_Delete(m_scalabilityOption);
     }
 
-    m_osInterface->pfnFreeResource(m_osInterface, &m_resSemaphoreAllPipes);
+    m_osInterface->pfnFreeResource(m_osInterface, &m_resSemaphoreAllPipes[0]);
+    m_osInterface->pfnFreeResource(m_osInterface, &m_resSemaphoreAllPipes[1]);
     m_osInterface->pfnFreeResource(m_osInterface, &m_resSemaphoreOnePipeWait);
 
     return MOS_STATUS_SUCCESS;
@@ -470,30 +488,41 @@
     SCALABILITY_FUNCTION_ENTER;
     SCALABILITY_CHK_NULL_RETURN(cmdBuffer);
     SCALABILITY_CHK_NULL_RETURN(m_hwInterface);
-    SCALABILITY_ASSERT(m_semaphoreAllPipesIndex < VP_SEMAPHORE_COUNT);
-    SCALABILITY_ASSERT(!Mos_ResourceIsNull(&m_resSemaphoreAllPipes));
+    SCALABILITY_ASSERT(m_semaphoreAllPipesIndex < VP_SEMAPHORE_COUNT * 2);
+    SCALABILITY_ASSERT(!Mos_ResourceIsNull(&m_resSemaphoreAllPipes[0]));
+    SCALABILITY_ASSERT(!Mos_ResourceIsNull(&m_resSemaphoreAllPipes[1]));
+
+    // use two Semaphore Buffer repeatly to avoid waiting for lock, use the first Semaphore Buffer when m_semaphoreAllPipesIndex < VP_SEMAPHORE_COUNT.
+    // when the m_semaphoreAllPipesIndex >= VP_SEMAPHORE_COUNT, switch to the second Semaphore Buffer
+    uint32_t semaphoreIndex = (m_semaphoreAllPipesIndex >= VP_SEMAPHORE_COUNT) ? 1 : 0;
 
     if (m_semaphoreAllPipesPhase == 0)
     {
         if (m_currentPipe == 0)
         {
-            char ocaMsg[] = "VEBOX0 SCALABILITY";
-            HalOcaInterfaceNext::TraceMessage(*cmdBuffer, (MOS_CONTEXT_HANDLE)m_osInterface->pOsContext, ocaMsg, sizeof(ocaMsg));
+            std::stringstream ss;
+            ss << "VEBOX0 SCALABILITY. semaphoreIndex 0x" << std::hex << semaphoreIndex << " m_semaphoreAllPipesIndex 0x"
+                << std::hex  << m_semaphoreAllPipesIndex ;
+            std::string ocaMsg = ss.str();
+            HalOcaInterfaceNext::TraceMessage(*cmdBuffer, (MOS_CONTEXT_HANDLE)m_osInterface->pOsContext, ocaMsg.c_str(), ocaMsg.length());
         }
         else
         {
-            char ocaMsg[] = "VEBOX1 SCALABILITY";
-            HalOcaInterfaceNext::TraceMessage(*cmdBuffer, (MOS_CONTEXT_HANDLE)m_osInterface->pOsContext, ocaMsg, sizeof(ocaMsg));
+            std::stringstream ss;
+            ss << "VEBOX1 SCALABILITY. semaphoreIndex 0x" << std::hex << semaphoreIndex << " m_semaphoreAllPipesIndex 0x"
+                << std::hex  << m_semaphoreAllPipesIndex ;
+            std::string ocaMsg = ss.str();
+            HalOcaInterfaceNext::TraceMessage(*cmdBuffer, (MOS_CONTEXT_HANDLE)m_osInterface->pOsContext, ocaMsg.c_str(), ocaMsg.length());
         }
 
         for (int32_t i = 0; i < 2 * m_pipeNum; i++)
         {
-            HalOcaInterfaceNext::OnIndirectState(*cmdBuffer, (MOS_CONTEXT_HANDLE)m_osInterface->pOsContext, &m_resSemaphoreAllPipes, (m_semaphoreAllPipesIndex + i) * sizeof(uint32_t), false, sizeof(uint32_t));
+            HalOcaInterfaceNext::OnIndirectState(*cmdBuffer, (MOS_CONTEXT_HANDLE)m_osInterface->pOsContext, &m_resSemaphoreAllPipes[semaphoreIndex], (m_semaphoreAllPipesIndex % VP_SEMAPHORE_COUNT + i) * sizeof(uint32_t), false, sizeof(uint32_t));
         }
     }
 
     // memset the semaphore to avoid the semaphore was not clear during media reset
-    if ((m_semaphoreAllPipesPhase == 0) && (m_currentPipe == 0))
+    if ((m_semaphoreAllPipesPhase == 0) && (m_currentPipe == 0) && (m_semaphoreAllPipesIndex % VP_SEMAPHORE_COUNT == 0))
     {
         MOS_LOCK_PARAMS lockFlagsWriteOnly;
         MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS));
@@ -501,40 +530,40 @@
 
         uint32_t *data = (uint32_t *)m_osInterface->pfnLockResource(
             m_osInterface,
-            &m_resSemaphoreAllPipes,
+            &m_resSemaphoreAllPipes[semaphoreIndex],
             &lockFlagsWriteOnly);
         SCALABILITY_CHK_NULL_RETURN(data);
-        MOS_ZeroMemory(data + m_semaphoreAllPipesIndex, 2 * m_pipeNum * sizeof(uint32_t));
+        MOS_ZeroMemory(data, VP_SEMAPHORE_COUNT * sizeof(uint32_t));
         SCALABILITY_CHK_STATUS_RETURN(m_osInterface->pfnUnlockResource(
             m_osInterface,
-            &m_resSemaphoreAllPipes));
+            &m_resSemaphoreAllPipes[semaphoreIndex]));
     }
 
     // Increment all pipe flags
     for (uint32_t i = 0; i < m_pipeNum; i++)
     {
-        if (!Mos_ResourceIsNull(&m_resSemaphoreAllPipes))
+        if (!Mos_ResourceIsNull(&m_resSemaphoreAllPipes[semaphoreIndex]))
         {
             SCALABILITY_CHK_STATUS_RETURN(SendMiAtomicDwordCmd(
-                &m_resSemaphoreAllPipes, (m_semaphoreAllPipesIndex + m_semaphoreAllPipesPhase * m_pipeNum + i) * sizeof(uint32_t), 1, MHW_MI_ATOMIC_INC, cmdBuffer));
+                &m_resSemaphoreAllPipes[semaphoreIndex], (m_semaphoreAllPipesIndex % VP_SEMAPHORE_COUNT + m_semaphoreAllPipesPhase * m_pipeNum + i) * sizeof(uint32_t), 1, MHW_MI_ATOMIC_INC, cmdBuffer));
         }
     }
 
-    if (!Mos_ResourceIsNull(&m_resSemaphoreAllPipes))
+    if (!Mos_ResourceIsNull(&m_resSemaphoreAllPipes[semaphoreIndex]))
     {
         // Waiting current pipe flag euqal to pipe number which means other pipes are executing
         SCALABILITY_CHK_STATUS_RETURN(SendHwSemaphoreWaitCmd(
-            &m_resSemaphoreAllPipes, (m_semaphoreAllPipesIndex + m_semaphoreAllPipesPhase * m_pipeNum + m_currentPipe) * sizeof(uint32_t), m_pipeNum, MHW_MI_SAD_EQUAL_SDD, cmdBuffer));
+            &m_resSemaphoreAllPipes[semaphoreIndex], (m_semaphoreAllPipesIndex % VP_SEMAPHORE_COUNT + m_semaphoreAllPipesPhase * m_pipeNum + m_currentPipe) * sizeof(uint32_t), m_pipeNum, MHW_MI_SAD_EQUAL_SDD, cmdBuffer));
 
         // Reset current pipe semaphore
         SCALABILITY_CHK_STATUS_RETURN(AddMiStoreDataImmCmd(
-            &m_resSemaphoreAllPipes, (m_semaphoreAllPipesIndex + m_semaphoreAllPipesPhase * m_pipeNum + m_currentPipe) * sizeof(uint32_t), cmdBuffer));
+            &m_resSemaphoreAllPipes[semaphoreIndex], (m_semaphoreAllPipesIndex % VP_SEMAPHORE_COUNT + m_semaphoreAllPipesPhase * m_pipeNum + m_currentPipe) * sizeof(uint32_t), cmdBuffer));
     }
 
     m_semaphoreAllPipesPhase = 1 - m_semaphoreAllPipesPhase;
     if ((m_semaphoreAllPipesPhase == 0) && (m_currentPipe == 1))
     {
-        m_semaphoreAllPipesIndex = (m_semaphoreAllPipesIndex + 2 * m_pipeNum) % VP_SEMAPHORE_COUNT;
+        m_semaphoreAllPipesIndex = (m_semaphoreAllPipesIndex + 2 * m_pipeNum) % (VP_SEMAPHORE_COUNT * 2);
     }
 
     return MOS_STATUS_SUCCESS;
diff --git a/media_softlet/agnostic/common/vp/hal/shared/scalability/vp_scalability_multipipe_next.h b/media_softlet/agnostic/common/vp/hal/shared/scalability/vp_scalability_multipipe_next.h
index fcd0b28..a4a0783 100644
--- a/media_softlet/agnostic/common/vp/hal/shared/scalability/vp_scalability_multipipe_next.h
+++ b/media_softlet/agnostic/common/vp/hal/shared/scalability/vp_scalability_multipipe_next.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2020-2023, Intel Corporation
+* Copyright (c) 2020-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -348,10 +348,10 @@
     std::vector<MOS_COMMAND_BUFFER> m_secondaryCmdBuffers;              //!< The secondary command buffer
     std::vector<bool>               m_secondaryCmdBuffersReturned;      //!< The secondary command buffer returned
     static const uint8_t            m_initSecondaryCmdBufNum = 4;       //!< The initial secondary command buffer size
-    static const uint8_t            m_maxCmdBufferSetsNum    = 8;       //!< The max number of command buffer sets
+    static const uint8_t            m_maxCmdBufferSetsNum    = 16;       //!< The max number of command buffer sets
     static const uint32_t           m_CmdBufferSize          = 0x4000;  //!< The command buffer size
 
-    MOS_RESOURCE                    m_resSemaphoreAllPipes    = {};     //!< The sync semaphore between all pipes
+    MOS_RESOURCE                    m_resSemaphoreAllPipes[2] = {};     //!< The sync semaphore between all pipes
     MOS_RESOURCE                    m_resSemaphoreOnePipeWait = {};     //!< The sync semaphore between main pipe and other pipes
     uint32_t                        m_semaphoreAllPipesIndex = 0;       //!< The index for semaphore using by current frame
     uint32_t                        m_semaphoreAllPipesPhase = 0;       //!< The count for semaphore using by current frame
diff --git a/media_softlet/agnostic/common/vp/hal/statusreport/vp_status_report.cpp b/media_softlet/agnostic/common/vp/hal/statusreport/vp_status_report.cpp
index 756901f..60d4fbe 100644
--- a/media_softlet/agnostic/common/vp/hal/statusreport/vp_status_report.cpp
+++ b/media_softlet/agnostic/common/vp/hal/statusreport/vp_status_report.cpp
@@ -96,6 +96,10 @@
     pStatusEntry->dwTag             = dwLastTag;
     pStatusEntry->dwStatus          = (eLastStatus == MOS_STATUS_SUCCESS)? VPREP_NOTREADY : VPREP_ERROR;
     pStatusTable->uiCurrent         = (pStatusTable->uiCurrent + 1) & (VPHAL_STATUS_TABLE_MAX_SIZE - 1);
+    if (pStatusTable->uiCurrent == pStatusTable->uiHead)
+    {
+        pStatusTable->uiHead = (pStatusTable->uiHead + 1) & (VPHAL_STATUS_TABLE_MAX_SIZE - 1);
+    }
 
 finish:
     return eStatus;
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 d561771..8116bb5 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
@@ -369,6 +369,20 @@
         0,
         true);
 
+    DeclareUserSettingKeyForDebug(
+        userSettingPtr,
+        __MEDIA_USER_FEATURE_VALUE_ENABLE_VP_L0_3DLUT,
+        MediaUserSetting::Group::Sequence,
+        0,
+        true);
+
+    DeclareUserSettingKeyForDebug(
+        userSettingPtr,
+        __MEDIA_USER_FEATURE_VALUE_VP_L0_3DLUT_ENABLED,
+        MediaUserSetting::Group::Sequence,
+        0,
+        true);
+
 #endif
 
     return MOS_STATUS_SUCCESS;
diff --git a/media_softlet/agnostic/common/vp/hal/utils/vp_dumper.cpp b/media_softlet/agnostic/common/vp/hal/utils/vp_dumper.cpp
index 1650a99..0222bb6 100644
--- a/media_softlet/agnostic/common/vp/hal/utils/vp_dumper.cpp
+++ b/media_softlet/agnostic/common/vp/hal/utils/vp_dumper.cpp
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2018-2023, Intel Corporation
+* Copyright (c) 2018-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -876,6 +876,14 @@
 
     bool           bAllocated;
 
+    Mos_MemPool memType = MOS_MEMPOOL_SYSTEMMEMORY;
+#if !EMUL
+    if (pSurface->OsResource.pGmmResInfo->GetSetCpSurfTag(false, 0) != 0)
+    {
+        memType = MOS_MEMPOOL_VIDEOMEMORY;
+    }
+#endif
+
     temp2DSurfForCopy = (PVPHAL_SURFACE)MOS_AllocAndZeroMemory(sizeof(VPHAL_SURFACE));
     VP_DEBUG_CHK_NULL_RETURN(temp2DSurfForCopy);
     VP_DEBUG_CHK_STATUS_RETURN(VpUtils::ReAllocateSurface(
@@ -892,7 +900,7 @@
         &bAllocated,
         MOS_HW_RESOURCE_DEF_MAX,
         MOS_TILE_UNSET_GMM,
-        MOS_MEMPOOL_SYSTEMMEMORY));
+        memType));
 
     pOsInterface->pfnDoubleBufferCopyResource(
         pOsInterface,
@@ -2773,6 +2781,13 @@
     VP_DEBUG_CHK_STATUS(VpDumperTool::AppendString(false, &pcOutContents, "\t\t\t\t<DEFAULT_COLOR type=\"integer\">0x000000FF</DEFAULT_COLOR>\n"));
     VP_DEBUG_CHK_STATUS(VpDumperTool::AppendString(false, &pcOutContents, "\t\t\t\t<FILE></FILE>\n"));
     VP_DEBUG_CHK_STATUS(VpDumperTool::AppendString(false, &pcOutContents, "\t\t\t</DATA>\n"));
+    //Gamut
+    if (pTarget->pGamutParams)
+    {
+        VP_DEBUG_CHK_STATUS(VpDumperTool::AppendString(false, &pcOutContents, "\t\t<VPHAL_GAMUT_PARAMS>\n"));
+        VP_DEBUG_CHK_STATUS(VpDumperTool::AppendString(false, &pcOutContents, "\t\t\t<GAMMA_VALUE>%s</GAMMA_VALUE>\n", VpParameterDumper::GetGammaValueTypeStr(pTarget->pGamutParams->GammaValue)));
+        VP_DEBUG_CHK_STATUS(VpDumperTool::AppendString(false, &pcOutContents, "\t\t</VPHAL_GAMUT_PARAMS>\n"));
+    }
 
 finish:
     return eStatus;
@@ -3003,6 +3018,8 @@
         case Format_Y410        : return _T("y410");
         case Format_P210        : return _T("p210");
         case Format_P216        : return _T("p216");
+        case Format_A16B16G16R16F : return _T("abgr16_float");
+        case Format_A16R16G16B16F : return _T("argb16_float");
         default                 : return _T("Err");
     }
 
@@ -3661,6 +3678,8 @@
     case Format_P216:               return _T("Format_P216");
     case Format_YV12_Planar:        return _T("Format_YV12_Planar");
     case Format_Count:              return _T("Format_Count");
+    case Format_A16B16G16R16F:      return _T("Format_A16B16G16R16F");
+    case Format_A16R16G16B16F:      return _T("Format_A16R16G16B16F");
     default:                        return _T("Err");
     }
 
@@ -3721,6 +3740,25 @@
     return nullptr;
 }
 
+const char *VpParameterDumper::GetGammaValueTypeStr(VPHAL_GAMMA_VALUE gamma_value)
+{
+    VP_FUNC_CALL();
+
+    switch (gamma_value)
+    {
+    case GAMMA_1P0:
+        return _T("GAMMA_1P0");
+    case GAMMA_2P2:
+        return _T("GAMMA_2P2");
+    case GAMMA_2P6:
+        return _T("GAMMA_2P6");
+    default:
+        return _T("Err");
+    }
+
+    return nullptr;
+}
+
 const char * VpParameterDumper::GetSampleTypeStr(VPHAL_SAMPLE_TYPE sample_type)
 {
     VP_FUNC_CALL();
diff --git a/media_softlet/agnostic/common/vp/hal/utils/vp_dumper.h b/media_softlet/agnostic/common/vp/hal/utils/vp_dumper.h
index 7bae688..3b0e244 100644
--- a/media_softlet/agnostic/common/vp/hal/utils/vp_dumper.h
+++ b/media_softlet/agnostic/common/vp/hal/utils/vp_dumper.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2018-2023, Intel Corporation
+* Copyright (c) 2018-2024, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -672,6 +672,7 @@
     //!
     const char * GetSurfaceTypeStr(VPHAL_SURFACE_TYPE surface_type);
 
+    const char *GetGammaValueTypeStr(VPHAL_GAMMA_VALUE gamma_value);
     //!
     //! \brief    Gets Debug Sample Type String
     //! \param    [in] sample type
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 ee87ed6..3ce5435 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
@@ -232,6 +232,7 @@
     MT_LOG3(MT_VP_USERFEATURE_CTRL, MT_NORMAL, MT_VP_UF_CTRL_DISABLE_VEOUT, m_ctrlValDefault.disableVeboxOutput,
         MT_VP_UF_CTRL_DISABLE_SFC, m_ctrlValDefault.disableSfc, MT_VP_UF_CTRL_CCS, m_ctrlValDefault.computeContextEnabled);
 
+#if (_DEBUG || _RELEASE_INTERNAL)
     uint32_t globalLutMode = VPHAL_HDR_LUT_MODE_NONE;
     status                 = ReadUserSetting(
         m_userSettingPtr,
@@ -270,6 +271,7 @@
     {
         m_ctrlValDefault.disableAutoMode = disableAutoMode;
     }
+#endif
 
     uint32_t splitFramePortions = 1;
     status                      = ReadUserSetting(
@@ -391,6 +393,22 @@
         // Default value
         m_ctrlValDefault.enableIFNCC = false;
     }
+
+    bool bEnableL03DLut = false;
+    eRegKeyReadStatus   = ReadUserSettingForDebug(
+        m_userSettingPtr,
+        bEnableL03DLut,
+        __MEDIA_USER_FEATURE_VALUE_ENABLE_VP_L0_3DLUT,
+        MediaUserSetting::Group::Sequence);
+    if (MOS_SUCCEEDED(eRegKeyReadStatus))
+    {
+        m_ctrlValDefault.bEnableL03DLut = bEnableL03DLut;
+    }
+    else
+    {
+        // Default value
+        m_ctrlValDefault.bEnableL03DLut = false;
+    }
 #endif
     return MOS_STATUS_SUCCESS;
 }
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 b132804..be38147 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
@@ -59,12 +59,14 @@
         uint32_t enabledSFCNv12P010LinearOutput = 0;
         uint32_t enabledSFCRGBPRGB24Output  = 0;
         bool     enableIFNCC                    = false;
+        bool     bEnableL03DLut                 = false;
 #endif
         bool disablePacketReuse             = false;
         bool enablePacketReuseTeamsAlways   = false;
 
         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               isExternal3DLutSupport  = true;
         bool               disableAutoMode    = false;
         bool               clearVideoViewMode = false;
         uint32_t           splitFramePortions = 1;
@@ -96,6 +98,11 @@
     {
         return m_ctrlVal.enableIFNCC;
     }
+
+    bool EnableL03DLut()
+    {
+        return m_ctrlVal.bEnableL03DLut;
+    }
 #endif
 
     virtual MOS_STATUS CreateUserSettingForDebug();
@@ -157,6 +164,11 @@
         return m_ctrlVal.gpuGenerate3DLUT;
     }
 
+    bool IsExternal3DLutSupport()
+    {
+        return m_ctrlVal.isExternal3DLutSupport;
+    }
+
     bool IsDisableAutoMode()
     {
         return m_ctrlVal.disableAutoMode;
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 893e48a..ab4747d 100644
--- a/media_softlet/agnostic/common/vp/hal/utils/vp_utils.h
+++ b/media_softlet/agnostic/common/vp/hal/utils/vp_utils.h
@@ -327,6 +327,9 @@
 #define __MEDIA_USER_FEATURE_VALUE_INTER_FRAME_MEMORY_NINJA_START_COUNTER "InterFrameNinjaStartCounter"
 #define __MEDIA_USER_FEATURE_VALUE_INTER_FRAME_MEMORY_NINJA_END_COUNTER "InterFrameNinjaEndCounter"
 #define __MEDIA_USER_FEATURE_VALUE_ENABLE_IFNCC                         "EnableIFNCC"
+// For L0 3DLut
+#define __MEDIA_USER_FEATURE_VALUE_ENABLE_VP_L0_3DLUT                   "Enable L0 3DLUT"
+#define __MEDIA_USER_FEATURE_VALUE_VP_L0_3DLUT_ENABLED                  "L0 3DLUT Enabled"
 #endif  //(_DEBUG || _RELEASE_INTERNAL)
 
 class VpUtils
diff --git a/media_softlet/agnostic/common/vp/kdll/hal_kerneldll_next.c b/media_softlet/agnostic/common/vp/kdll/hal_kerneldll_next.c
index 151f3b0..b255c86 100644
--- a/media_softlet/agnostic/common/vp/kdll/hal_kerneldll_next.c
+++ b/media_softlet/agnostic/common/vp/kdll/hal_kerneldll_next.c
@@ -2594,6 +2594,7 @@
                 // Exceeded number of CSC matrices allowed
                 if (matrix_count == DL_CSC_MAX)
                 {
+                    VP_RENDER_ASSERTMESSAGE("CSC matrix count %d exceeded number of CSC matrices allowed!", matrix_count);
                     return false;
                 }
 
@@ -2689,7 +2690,8 @@
                 }
                 else
                 {
-                    VP_RENDER_NORMALMESSAGE("Patch CSC coefficient exceed limitation");
+                    VP_RENDER_ASSERTMESSAGE("Patch CSC coefficient number %d exceed limitation %d!", pSearchState->CscParams.PatchMatrixNum, DL_CSC_MAX);
+                    return nullptr;
                 }
             }
 
@@ -2698,7 +2700,7 @@
     }
     else
     {
-        VP_RENDER_NORMALMESSAGE("Invalid patch kind %d.", iPatchKind);
+        VP_RENDER_ASSERTMESSAGE("Invalid patch kind %d.", iPatchKind);
     }
 
     return nullptr;
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 9f782f7..5f693fd 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
@@ -177,7 +177,22 @@
     MEDIA_WR_SKU(skuTable, FtrHcpDecMemoryCompression, 0);
     MEDIA_WR_SKU(skuTable, Ftr10bitDecMemoryCompression, 0);
 
+#if (_DEBUG || _RELEASE_INTERNAL)
+    uint32_t value = 0;
+    ReadUserSettingForDebug(
+        userSettingPtr,
+        value,
+        __MEDIA_USER_FEATURE_VALUE_ENABLE_MEDIA_CCS,
+        MediaUserSetting::Group::Device);
+
+    /* MEDIA_CSS default value is 1 */
+    if (value > 1)
+        value = 1;
+
+    MEDIA_WR_SKU(skuTable, FtrCCSNode, (uint8_t)value);
+#else
     MEDIA_WR_SKU(skuTable, FtrCCSNode, 1);
+#endif
 
     MEDIA_WR_SKU(skuTable, FtrVpP010Output, 1);
     MEDIA_WR_SKU(skuTable, FtrVp10BitSupport, 1);
@@ -339,4 +354,4 @@
 };
 
 static bool arlDeviceRegister = DeviceInfoFactory<LinuxDeviceInit>::
-    RegisterDevice((uint32_t)IGFX_ARROWLAKE, &arlDeviceInit);
\ No newline at end of file
+    RegisterDevice((uint32_t)IGFX_ARROWLAKE, &arlDeviceInit);
diff --git a/media_softlet/linux/common/cp/decode_cp_bitstream.h b/media_softlet/linux/common/cp/decode_cp_bitstream.h
index 25b40c7..24482fb 100644
--- a/media_softlet/linux/common/cp/decode_cp_bitstream.h
+++ b/media_softlet/linux/common/cp/decode_cp_bitstream.h
@@ -32,6 +32,8 @@
 #include "decode_sub_pipeline.h"
 #include "codec_def_decode.h"
 #include "media_feature_manager.h"
+#include "decode_status_report.h"
+#include "codechal_debug.h"
 
 namespace decode
 {
@@ -75,6 +77,27 @@
     //!         Return the media function
     //!
     MediaFunction GetMediaFunction() { return VdboxDecodeWaFunc;}
+
+    
+#if USE_CODECHAL_DEBUG_TOOL
+    //!
+    //! \brief  Dump Output
+    //! \param  [in] reportData
+    //!         Decode status report data
+    //! \return MOS_STATUS
+    //!         MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    virtual MOS_STATUS DumpOutput(const DecodeStatusReportData& reportData) {return MOS_STATUS_SUCCESS;}
+    
+    //!
+    //! \brief  InitStatusReportParam
+    //! \param  [in] inputParameters
+    //!         Decode status report parameters
+    //! \return MOS_STATUS
+    //!         MOS_STATUS_SUCCESS if success, else fail reason
+    //!
+    virtual MOS_STATUS InitStatusReportParam(DecodeStatusParameters &inputParameters) {return MOS_STATUS_SUCCESS;}
+#endif
 protected:
     //!
     //! \brief  Initialize scalability parameters
diff --git a/media_softlet/linux/common/os/i915/mos_bufmgr.c b/media_softlet/linux/common/os/i915/mos_bufmgr.c
index 8ed57f7..75f1df4 100644
--- a/media_softlet/linux/common/os/i915/mos_bufmgr.c
+++ b/media_softlet/linux/common/os/i915/mos_bufmgr.c
@@ -1588,15 +1588,19 @@
     CHK_CONDITION(bufmgr_gem == nullptr, "bufmgr_gem == nullptr\n", );
 
     if (bo_gem->mem_virtual) {
-        VG(VALGRIND_FREELIKE_BLOCK(bo_gem->mem_virtual, 0));
+        VG(VALGRIND_MAKE_MEM_NOACCESS(bo_gem->mem_virtual, 0));
         drm_munmap(bo_gem->mem_virtual, bo_gem->bo.size);
+        bo_gem->mem_virtual = nullptr;
     }
     if (bo_gem->gtt_virtual) {
+        VG(VALGRIND_MAKE_MEM_NOACCESS(bo_gem->gtt_virtual, 0));
         drm_munmap(bo_gem->gtt_virtual, bo_gem->bo.size);
+        bo_gem->gtt_virtual = nullptr;
     }
     if (bo_gem->mem_wc_virtual) {
-        VG(VALGRIND_FREELIKE_BLOCK(bo_gem->mem_wc_virtual, 0));
+        VG(VALGRIND_MAKE_MEM_NOACCESS(bo_gem->mem_wc_virtual, 0));
         drm_munmap(bo_gem->mem_wc_virtual, bo_gem->bo.size);
+        bo_gem->mem_wc_virtual = nullptr;
     }
 
     if(bufmgr_gem->bufmgr.bo_wait_rendering && mos_gem_bo_busy(bo))
diff --git a/media_softlet/linux/common/os/i915_production/mos_bufmgr.c b/media_softlet/linux/common/os/i915_production/mos_bufmgr.c
index 190bd49..1e5d02f 100644
--- a/media_softlet/linux/common/os/i915_production/mos_bufmgr.c
+++ b/media_softlet/linux/common/os/i915_production/mos_bufmgr.c
@@ -1568,15 +1568,19 @@
     CHK_CONDITION(bufmgr_gem == nullptr, "bufmgr_gem == nullptr\n", );
 
     if (bo_gem->mem_virtual) {
-        VG(VALGRIND_FREELIKE_BLOCK(bo_gem->mem_virtual, 0));
+        VG(VALGRIND_MAKE_MEM_NOACCESS(bo_gem->mem_virtual, 0));
         drm_munmap(bo_gem->mem_virtual, bo_gem->bo.size);
+        bo_gem->mem_virtual = nullptr;
     }
     if (bo_gem->gtt_virtual) {
+        VG(VALGRIND_MAKE_MEM_NOACCESS(bo_gem->gtt_virtual, 0));
         drm_munmap(bo_gem->gtt_virtual, bo_gem->bo.size);
+        bo_gem->gtt_virtual = nullptr;
     }
     if (bo_gem->mem_wc_virtual) {
-        VG(VALGRIND_FREELIKE_BLOCK(bo_gem->mem_wc_virtual, 0));
+        VG(VALGRIND_MAKE_MEM_NOACCESS(bo_gem->mem_wc_virtual, 0));
         drm_munmap(bo_gem->mem_wc_virtual, bo_gem->bo.size);
+        bo_gem->mem_wc_virtual = nullptr;
     }
 
     if(bufmgr_gem->bufmgr.bo_wait_rendering && mos_gem_bo_busy(bo))
diff --git a/media_softlet/linux/common/os/mos_interface.cpp b/media_softlet/linux/common/os/mos_interface.cpp
index 451be53..3ffacc8 100644
--- a/media_softlet/linux/common/os/mos_interface.cpp
+++ b/media_softlet/linux/common/os/mos_interface.cpp
@@ -723,7 +723,57 @@
 }
 
 #if MOS_COMMAND_BUFFER_DUMP_SUPPORTED
-MOS_STATUS MosInterface::DumpIndirectState(
+MOS_STATUS MosInterface::DumpIndirectStates(MOS_STREAM_HANDLE streamState, const char *filePathPrefix, std::time_t currentTime)
+{
+    MOS_OS_CHK_NULL_RETURN(streamState);
+    MOS_STATUS     eStatus                 = MOS_STATUS_SUCCESS;
+    auto           &inDirectStateInfoArray = streamState->indirectStateInfo;
+    const uint32_t SIZE_OF_ONE_WORD        = 9;
+
+    for (auto &lastElement : inDirectStateInfoArray)
+    {
+        if (lastElement.indirectState == nullptr)
+        {
+            MOS_OS_NORMALMESSAGE("IndirectState pointer is nullptr");
+            continue;
+        }
+        uint32_t         *data             = (uint32_t *)lastElement.indirectState;
+        uint32_t          dwordCount       = lastElement.stateSize / 4;
+        uint32_t          dwBytesWritten   = 0;
+        uint32_t          dwSizeToAllocate = 0;
+        char             *outputBuffer     = nullptr;
+        std::stringstream fileName;
+
+        dwSizeToAllocate = dwordCount * (SIZE_OF_ONE_WORD + 1);               // Add 1 byte for the space following each Dword.
+        outputBuffer     = (char *)MOS_AllocAndZeroMemory(dwSizeToAllocate);  // Alloc output buffer.
+        if (outputBuffer == nullptr)
+        {
+            MOS_OS_NORMALMESSAGE("Alloc outputBuffer failed");
+            inDirectStateInfoArray.clear();
+            return MOS_STATUS_SUCCESS;
+        }
+        for (uint32_t i = 0; i < dwordCount; ++i)
+        {
+            dwBytesWritten += MosUtilities::MosSecureStringPrint(
+                outputBuffer + dwBytesWritten,
+                SIZE_OF_ONE_WORD + 1,
+                SIZE_OF_ONE_WORD + 1,
+                "%.8x ",
+                data[i]);
+        }
+        fileName << filePathPrefix << "_" << std::hex << *lastElement.gfxAddressBottom << "_" << *lastElement.gfxAddressTop << "_" << lastElement.stateName << ".txt";
+        eStatus = MosUtilities::MosAppendFileFromPtr((const char *)fileName.str().c_str(), outputBuffer, dwBytesWritten);
+        if (eStatus != MOS_STATUS_SUCCESS)
+        {
+            MOS_OS_NORMALMESSAGE("DumpIndirectStates %s failed", fileName.str().c_str());
+        }
+        MOS_FreeMemory(outputBuffer);
+    }
+    inDirectStateInfoArray.clear();
+    return eStatus;
+}
+
+MOS_STATUS MosInterface::DumpBindingTable(
     MOS_STREAM_HANDLE     streamState,
     COMMAND_BUFFER_HANDLE cmdBuffer,
     MOS_GPU_NODE          gpuNode,
@@ -791,6 +841,7 @@
     // Maximum length of engine name is 6
     char sEngName[6];
     size_t nSizeFileNamePrefix   = 0;
+    std::time_t currentTime      = std::time(nullptr);
 
     MOS_OS_CHK_NULL_RETURN(streamState);
     MOS_OS_CHK_NULL_RETURN(cmdBuffer);
@@ -846,12 +897,13 @@
             sFileName + nSizeFileNamePrefix,
             sizeof(sFileName) - nSizeFileNamePrefix,
             sizeof(sFileName) - nSizeFileNamePrefix,
-            "%c%s%c%s_%d.txt",
+            "%c%s%c%s_%d_%d.txt",
             MOS_DIR_SEPERATOR,
             MOS_COMMAND_BUFFER_OUT_DIR,
             MOS_DIR_SEPERATOR,
             MOS_COMMAND_BUFFER_OUT_FILE,
-            dwCommandBufferNumber);
+            dwCommandBufferNumber,
+            currentTime);
 
         // Write the output buffer to file.
         if((eStatus = MosUtilities::MosWriteFileFromPtr((const char *)sFileName, pOutputBuffer, dwBytesWritten)) != MOS_STATUS_SUCCESS)
@@ -906,10 +958,15 @@
             MOS_FreeMemory(pOutputBuffer);
             MOS_OS_CHK_STATUS_RETURN(eStatus);
         }
-        if((eStatus = DumpIndirectState(streamState, cmdBuffer, gpuNode, sFileName)) != MOS_STATUS_SUCCESS)
+        if ((eStatus = DumpBindingTable(streamState, cmdBuffer, gpuNode, sFileName)) != MOS_STATUS_SUCCESS)
         {
             MOS_FreeMemory(pOutputBuffer);
-            MOS_OS_CHK_STATUS_RETURN(eStatus);
+            return eStatus;
+        }
+        if ((eStatus = DumpIndirectStates(streamState, sFileName, currentTime)) != MOS_STATUS_SUCCESS)
+        {
+            MOS_FreeMemory(pOutputBuffer);
+            return eStatus;
         }
     }
 
@@ -1886,6 +1943,17 @@
     details.bIsCompressed   = gmmResourceInfo->IsMediaMemoryCompressed(0);
     details.CompressionMode = (MOS_RESOURCE_MMC_MODE)gmmResourceInfo->GetMmcMode(0);
 
+    auto skuTable = MosInterface::GetSkuTable(streamState);
+    if(skuTable && MEDIA_IS_SKU(skuTable, FtrNewCompression))
+    {
+        if (gmmResourceInfo->GetResFlags().Info.MediaCompressed == 1)
+        {
+            details.CompressionMode = MOS_MMC_MC;
+            details.bIsCompressed = 1;
+            details.bCompressible = (details.CompressionMode != MOS_MMC_DISABLED) ? true : false;
+        }
+    }
+
     if (0 == details.dwPitch)
     {
         MOS_OS_ASSERTMESSAGE("Pitch from GmmResource is 0, unexpected.");
@@ -2201,7 +2269,8 @@
     SYNC_HAZARD         hazardType,
     GPU_CONTEXT_HANDLE  busyCtx,
     GPU_CONTEXT_HANDLE  requestorCtx,
-    OS_HANDLE           osHandle)
+    OS_HANDLE           osHandle,
+    SYNC_FENCE_INFO_TRINITY *fenceInfoTrinity)
 {
     MOS_OS_FUNCTION_ENTER;
 
@@ -2318,6 +2387,23 @@
     // Get Gmm resource info
     gmmResourceInfo = (GMM_RESOURCE_INFO *)resource->pGmmResInfo;
     MOS_OS_CHK_NULL_RETURN(gmmResourceInfo);
+    auto skuTable = GetSkuTable(streamState);
+    MOS_OS_CHK_NULL_RETURN(MosInterface::GetGmmClientContext(streamState));
+    MOS_OS_CHK_NULL_RETURN(skuTable);
+
+    if (MEDIA_IS_SKU(skuTable, FtrNewCompression))
+    {
+        // reusing MC to mark all media engins to turn on compression
+        if (resource->pGmmResInfo->GetResFlags().Info.MediaCompressed == 1)
+        {
+            resMmcMode = MOS_MEMCOMP_MC;
+        }
+        else
+        {
+            resMmcMode = MOS_MEMCOMP_DISABLED;
+        }
+        return MOS_STATUS_SUCCESS;
+    }
 
     flags = resource->pGmmResInfo->GetResFlags();
 
@@ -2351,9 +2437,6 @@
     uint32_t          MmcFormat = 0;
     GMM_RESOURCE_FORMAT gmmResFmt;
     gmmResFmt = gmmResourceInfo->GetResourceFormat();
-    auto skuTable = GetSkuTable(streamState);
-    MOS_OS_CHK_NULL_RETURN(MosInterface::GetGmmClientContext(streamState));
-    MOS_OS_CHK_NULL_RETURN(skuTable);
 
     if (resMmcMode == MOS_MEMCOMP_MC)
     {
@@ -2816,10 +2899,53 @@
 {
     if (gmmClient && gmmResourceInfo)
     {
+        auto IsFormatSupportCompression = [=]()->bool
+        {
+            // formats support compression match to copy supported formats except RGBP&BGRP
+            switch(GmmFmtToMosFmt(gmmResourceInfo->GetResourceFormat()))
+            {
+            case Format_NV12:
+            case Format_YV12:
+            case Format_I420:
+            case Format_P010:
+            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:
+            case Format_A8:
+            case Format_Y16U:
+                return true;
+            case Format_P016:
+                // For P016 format we use SW swizzle because of history with reason (some hard code plane offset calculation in vaGetImage/vaPutImage).
+                return false;
+            default:
+                return false;
+            }
+        };
         // GetDriverProtectionBits funtion could hide gmm details info,
         // and we should use GetDriverProtectionBits to replace CachePolicyGetPATIndex in future.
         // isCompressionEnable could be false temparaily.
         bool isCompressionEnable = false;
+        if (gmmResourceInfo->GetResFlags().Info.MediaCompressed     &&
+            IsFormatSupportCompression()                            &&
+            gmmResourceInfo->GetResFlags().Info.Tile4 == 1          &&
+            gmmResourceInfo->GetBaseWidth() > 64                    &&
+            gmmResourceInfo->GetBaseHeight() > 64)
+        {
+            isCompressionEnable = true;
+        }
         return gmmClient->CachePolicyGetPATIndex(
                                             gmmResourceInfo,
                                             gmmResourceInfo->GetCachePolicyUsage(),
diff --git a/media_softlet/linux/common/os/mos_user_setting_specific.cpp b/media_softlet/linux/common/os/mos_user_setting_specific.cpp
index caed584..9c087f9 100644
--- a/media_softlet/linux/common/os/mos_user_setting_specific.cpp
+++ b/media_softlet/linux/common/os/mos_user_setting_specific.cpp
@@ -59,5 +59,14 @@
         0,
         false); //
 
+#if (_DEBUG || _RELEASE_INTERNAL)
+    DeclareUserSettingKeyForDebug(
+        userSettingPtr,
+        __MEDIA_USER_FEATURE_VALUE_ENABLE_MEDIA_CCS,
+        MediaUserSetting::Group::Device,
+        1,
+        false); //
+#endif
+
     return MOS_STATUS_SUCCESS;
 }
diff --git a/media_softlet/linux/common/os/osservice/mos_utilities_specific.cpp b/media_softlet/linux/common/os/osservice/mos_utilities_specific.cpp
index 96785e2..c8eb99e 100644
--- a/media_softlet/linux/common/os/osservice/mos_utilities_specific.cpp
+++ b/media_softlet/linux/common/os/osservice/mos_utilities_specific.cpp
@@ -1554,6 +1554,9 @@
             std::string id       = "";
 
             static const char *disableReportRegKeyList[] = {
+#if (_DEBUG || _RELEASE_INTERNAL)
+                __MEDIA_USER_FEATURE_VALUE_ENABLE_MEDIA_CCS,
+#endif
                 "INTEL MEDIA ALLOC MODE"
             };
             static const uint32_t disableReportRegKeyListCount = sizeof(disableReportRegKeyList) / sizeof(disableReportRegKeyList[0]);
diff --git a/media_softlet/linux/common/os/xe/include/mos_synchronization_xe.h b/media_softlet/linux/common/os/xe/include/mos_synchronization_xe.h
index 115fc27..70f9eea 100644
--- a/media_softlet/linux/common/os/xe/include/mos_synchronization_xe.h
+++ b/media_softlet/linux/common/os/xe/include/mos_synchronization_xe.h
@@ -41,51 +41,24 @@
 
 struct mos_xe_dep {
     /**
-     * Maximun count of dependency;
+     * Indicate to the handle for timeline syncobj.
      */
-#define MAX_DEPS_SIZE 32
-
-    struct drm_xe_sync sync;
+    uint32_t syncobj_handle;
     /**
-     * Indicate dep is free status
-     */
-#define STATUS_DEP_FREE    1
-    /**
-     * Indicate dep is busy status
-     */
-#define STATUS_DEP_BUSY   2
-    /**
-     * Save dep status;
-     * If the dep is getting from the queue and waiting to add into exec syncs array, it should be set as STATUS_DEP_BUSY
-     * If the dep is signaled and moved to free queue, it should be set as STATUS_DEP_FREE
-     */
-    uint8_t status;
-
-    /**
-     * Indicate to the timeline index in the busy queue.
+     * Indicate to latest avaiable timeline value(index) for fence out point.
      */
     uint64_t timeline_index;
-
-    /**
-     * Sync obj needs to be used in DRM_IOCTL_XE_EXEC and DRM_IOCTL_SYNCOBJ_WAIT.
-     * If ref_count != 0, it means this sync obj is still being used in DRM_IOCTL_XE_EXEC or DRM_IOCTL_SYNCOBJ_WAIT.
-     * Should protect this sync obj by sync_obj_rw_lock when resetting or destroying this sync obj which is being used.
-     * If ref_count == 0, we could reset or destroy this sync obj without sync_obj_rw_lock protection.
-     */
-    atomic_t ref_count;
 };
 
 struct mos_xe_bo_dep
 {
     /**
-     * Indicate to reusable dep in the ctx queue
+     * Indicate to reusable dep in the ctx queue.
      */
     struct mos_xe_dep *dep;
 
     /**
-     * Save timeline_index of this bo
-     * If bo's timeline_index does't equal to busy dep's timeline_index,
-     * It means this busy dep is finished for this bo and reused by other bo.
+     * Indicate to the timeline point that bo execution on certain exec queue.
      */
     uint64_t exec_timeline_index;
 };
@@ -117,8 +90,9 @@
             uint32_t bo_handle, uint32_t flags,
             std::vector<struct drm_xe_sync> &syncs,
             int &out_prime_fd);
-struct mos_xe_dep *mos_sync_update_exec_syncs_from_timeline_queue(int fd,
-            std::queue<struct mos_xe_dep*> &queue_busy,
+struct mos_xe_dep *mos_sync_create_timeline_dep(int fd);
+void mos_sync_update_exec_syncs_from_timeline_dep(int fd,
+            struct mos_xe_dep *dep,
             std::vector<struct drm_xe_sync> &syncs);
 int mos_sync_update_bo_deps(uint32_t curr_engine,
             uint32_t flags, mos_xe_dep *dep,
@@ -130,8 +104,7 @@
             std::map<uint32_t, uint64_t> &max_timeline_data,
             uint32_t lst_write_engine,
             uint32_t rw_flags);
-void mos_sync_clear_dep_queue(int fd, std::queue<struct mos_xe_dep*> &queue);
-void mos_sync_clear_dep_list(int fd, std::list<struct mos_xe_dep*> &temp_list);
+void mos_sync_destroy_timeline_dep(int fd, struct mos_xe_dep *dep);
 
 
 #if defined(__cplusplus)
diff --git a/media_softlet/linux/common/os/xe/mos_bufmgr_xe.c b/media_softlet/linux/common/os/xe/mos_bufmgr_xe.c
index 9bc065e..8a2e3dc 100644
--- a/media_softlet/linux/common/os/xe/mos_bufmgr_xe.c
+++ b/media_softlet/linux/common/os/xe/mos_bufmgr_xe.c
@@ -98,22 +98,12 @@
 
 struct mos_xe_context {
     struct mos_linux_context ctx;
-    /**
-     *1.If dep_queue_free not empty, then pop() it to use as fence out with status=STATUS_DEP_BUSY set and
-     *  add it into exec syncs array then push() it to dep_queue_busy after exec submission and update it into bo read and write deps.
-     *2.If dep_queue_busy.size() achieves maximun size of MAX_DEPS_SIZE, pop() it to use as fence out with status=STATUS_DEP_BUSY set
-     *  and reset(wait) it before adding into exec syncs array.
-     *  Otherwise, create new dep with STATUS_DEP_BUSY set and add it into exec syncs array.
-     *3.If one dep in the dep_queue_busy is confirmed as signaled by any caller, then umd could move all ones whose
-     *  timeline_index ahead of its from busy queue to free queue with status=STATUS_DEP_FREE set.
-     */
-    std::queue<struct mos_xe_dep*> dep_queue_free;
-    std::queue<struct mos_xe_dep*> dep_queue_busy;
 
     /**
-     * Free dep list in which free deps have not been reseted and could not reuse directly.
+     * Always keep the latest avaiable timeline index for
+     * such execution's fence out point.
      */
-    std::list<struct mos_xe_dep*> free_dep_tmp_list;
+    struct mos_xe_dep* timeline_dep;
 
     /**
      * The UMD's dummy exec_queue id for exec_queue ctx.
@@ -121,10 +111,6 @@
     uint32_t dummy_exec_queue_id;
 
     /**
-     * Indicates to current timeline index in the queue.
-     */
-    uint64_t cur_timeline_index;
-    /**
      * Indicate to the ctx width.
      */
     uint8_t ctx_width;
@@ -157,6 +143,23 @@
     uint32_t reset_count;
 };
 
+typedef struct mos_xe_device {
+    /**
+     * Note: we agree that hw_config[0] points to the number of hw config in total
+     * And hw config data starts from hw_config[1]
+     */
+    uint32_t *hw_config = nullptr;
+    struct drm_xe_query_config *config = nullptr;
+    struct drm_xe_query_engines *engines = nullptr;
+    struct drm_xe_query_mem_regions *mem_regions = nullptr;
+    struct drm_xe_query_gt_list *gt_list = nullptr;
+
+    /**
+     * Note: we agree here that uc_versions[0] for guc version and uc_versions[1] for huc version
+     */
+    struct drm_xe_query_uc_fw_version uc_versions[UC_TYPE_MAX];
+} mos_xe_device;
+
 typedef struct mos_xe_bufmgr_gem {
     struct mos_bufmgr bufmgr;
 
@@ -179,7 +182,6 @@
     int mem_profiler_fd;
 
     uint32_t gt_id;
-    bool     has_vram;
 
     /**
      * This RW lock is used for avoid reading or writing the same sync obj in KMD.
@@ -195,21 +197,19 @@
 
     uint32_t vm_id;
 
-    uint32_t *hw_config;
-    uint32_t config_len;
-    struct drm_xe_query_config *config;
-    struct drm_xe_query_engines *engines;
-    struct drm_xe_query_mem_regions *mem_regions;
-    struct drm_xe_query_gt_list *gt_list;
-
     /**
-     * Note: we agree here that uc_versions[0] for guc version and uc_versions[1] for huc version
+     * Everything queried from kmd that indicates to hw infomation.
      */
-    struct drm_xe_query_uc_fw_version uc_versions[UC_TYPE_MAX];
+    struct mos_xe_device xe_device;
+
+    //Note: DON't put these fields in xe_device
+    bool     has_vram;
+    uint8_t  va_bits;
     /** bitmask of all memory regions */
-    uint64_t memory_regions;
+    uint64_t mem_regions_mask;
     /** @default_alignment: safe alignment regardless region location */
     uint32_t default_alignment[MOS_XE_MEM_CLASS_MAX] = {PAGE_SIZE_4K, PAGE_SIZE_4K};
+    //End of Note
 
     /**
      * Indicates whether gpu-gpu and cpu-gpu synchronization is disabled.
@@ -413,7 +413,6 @@
 static pthread_mutex_t bufmgr_list_mutex = PTHREAD_MUTEX_INITIALIZER;
 static drmMMListHead bufmgr_list = { &bufmgr_list, &bufmgr_list };
 
-static struct drm_xe_query_gt_list *__mos_query_gt_list_xe(int fd);
 static void mos_bo_free_xe(struct mos_linux_bo *bo);
 static int mos_query_engines_count_xe(struct mos_bufmgr *bufmgr, unsigned int *nengine);
 int mos_query_engines_xe(struct mos_bufmgr *bufmgr,
@@ -438,48 +437,69 @@
     return nullptr;
 }
 
-static uint32_t __mos_query_memory_regions_xe(int fd)
+#define MOS_DRM_CHK_XE_DEV(xe_dev, info, query_func, retval)                 \
+    MOS_DRM_CHK_NULL_RETURN_VALUE(xe_dev, retval);                           \
+    if (xe_dev->info == nullptr)                                             \
+    {                                                                        \
+        xe_dev->info = query_func(fd);                                       \
+        MOS_DRM_CHK_NULL_RETURN_VALUE(xe_dev->info, retval);                 \
+    }
+
+static struct drm_xe_query_gt_list *
+__mos_query_gt_list_xe(int fd)
 {
     int ret = 0;
-    uint64_t __memory_regions = 0;
     struct drm_xe_query_gt_list *gt_list;
-    struct mos_xe_bufmgr_gem *bufmgr_gem = mos_bufmgr_gem_find(fd);
+    struct drm_xe_device_query query;
+    memclear(query);
+    query.query = DRM_XE_DEVICE_QUERY_GT_LIST;
 
-    if (bufmgr_gem && bufmgr_gem->gt_list)
+    ret = drmIoctl(fd, DRM_IOCTL_XE_DEVICE_QUERY,
+                &query);
+    if (ret || !query.size)
     {
-        gt_list = bufmgr_gem->gt_list;
-    }
-    else
-    {
-        gt_list = __mos_query_gt_list_xe(fd);
+        return nullptr;
     }
 
-    if(gt_list)
-    {
-        for (int i = 0; i < gt_list->num_gt; i++) {
-            __memory_regions |= gt_list->gt_list[i].near_mem_regions |
-                gt_list->gt_list[i].far_mem_regions;
-        }
+    gt_list = (drm_xe_query_gt_list *)calloc(1, query.size);
+    MOS_DRM_CHK_NULL_RETURN_VALUE(gt_list, nullptr);
 
-        if (!bufmgr_gem)
-        {
-            MOS_XE_SAFE_FREE(gt_list)
-        }
-        else if (bufmgr_gem && !bufmgr_gem->gt_list)
-        {
-            bufmgr_gem->gt_list = gt_list;
-        }
+    query.data = (uintptr_t)(gt_list);
+    ret = drmIoctl(fd, DRM_IOCTL_XE_DEVICE_QUERY,
+                &query);
+    if (ret || !query.size || 0 == gt_list->num_gt)
+    {
+        MOS_XE_SAFE_FREE(gt_list);
+        return nullptr;
     }
 
-    if (bufmgr_gem)
-    {
-        atomic_dec(&bufmgr_gem->ref_count, 1);
+    return gt_list;
+}
+
+static uint32_t __mos_query_mem_regions_instance_mask_xe(struct mos_bufmgr *bufmgr)
+{
+    MOS_DRM_CHK_NULL_RETURN_VALUE(bufmgr, 0)
+    struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *)bufmgr;
+    struct mos_xe_device *dev = &bufmgr_gem->xe_device;
+    int fd = bufmgr_gem->fd;
+    uint64_t __memory_regions = 0;
+
+    MOS_DRM_CHK_XE_DEV(dev, gt_list, __mos_query_gt_list_xe, 0)
+
+    struct drm_xe_query_gt_list *gt_list = dev->gt_list;
+    for (int i = 0; i < gt_list->num_gt; i++) {
+        /**
+         * Note: __memory_regions is the mem region instance mask on all tiles and gts
+         */
+        __memory_regions |= gt_list->gt_list[i].near_mem_regions |
+            gt_list->gt_list[i].far_mem_regions;
     }
 
+    bufmgr_gem->mem_regions_mask = __memory_regions;
+
     return __memory_regions;
 }
 
-
 static struct drm_xe_query_mem_regions *
 __mos_query_mem_regions_xe(int fd)
 {
@@ -491,25 +511,16 @@
 
     ret = drmIoctl(fd, DRM_IOCTL_XE_DEVICE_QUERY,
                 &query);
-    if(ret || !query.size)
+    if (ret || !query.size)
     {
         return nullptr;
     }
 
-    mem_regions = (drm_xe_query_mem_regions *)malloc(query.size);
-    if (mem_regions != nullptr)
-    {
-        memset(mem_regions, 0, query.size);
-    }
-    else
-    {
-        MOS_DRM_ASSERTMESSAGE("malloc mem_regions failed");
-        return nullptr;
-    }
+    mem_regions = (drm_xe_query_mem_regions *)calloc(1, query.size);
+    MOS_DRM_CHK_NULL_RETURN_VALUE(mem_regions, nullptr);
 
     query.data = (uintptr_t)(mem_regions);
-    ret = drmIoctl(fd, DRM_IOCTL_XE_DEVICE_QUERY,
-                &query);
+    ret = drmIoctl(fd, DRM_IOCTL_XE_DEVICE_QUERY, &query);
     if (ret || !query.size || 0 == mem_regions->num_mem_regions)
     {
         MOS_XE_SAFE_FREE(mem_regions);
@@ -519,56 +530,24 @@
     return mem_regions;
 }
 
-uint8_t __mos_query_vram_region_count_xe(int fd)
+uint8_t __mos_query_vram_region_count_xe(struct mos_xe_device *dev, int fd)
 {
-    struct drm_xe_query_mem_regions *mem_regions;
-    uint8_t num_regions = 0;
     uint8_t vram_regions = 0;
-    struct mos_xe_bufmgr_gem *bufmgr_gem = mos_bufmgr_gem_find(fd);
 
-    if (bufmgr_gem && bufmgr_gem->mem_regions)
-    {
-        mem_regions = bufmgr_gem->mem_regions;
-    }
-    else
-    {
-        mem_regions = __mos_query_mem_regions_xe(fd);
-    }
+    MOS_DRM_CHK_XE_DEV(dev, mem_regions, __mos_query_mem_regions_xe, 0)
 
-    if(mem_regions)
+    struct drm_xe_query_mem_regions *mem_regions = dev->mem_regions;
+    for (int i =0; i < mem_regions->num_mem_regions; i++)
     {
-        num_regions = mem_regions->num_mem_regions;
-        for(int i =0; i < num_regions; i++)
+        if (mem_regions->mem_regions[i].mem_class == DRM_XE_MEM_REGION_CLASS_VRAM)
         {
-            if(mem_regions->mem_regions[i].mem_class == DRM_XE_MEM_REGION_CLASS_VRAM)
-            {
-                vram_regions++;
-            }
+            vram_regions++;
         }
-
-        if (!bufmgr_gem)
-        {
-            MOS_XE_SAFE_FREE(mem_regions)
-        }
-        else if (bufmgr_gem && !bufmgr_gem->mem_regions)
-        {
-            bufmgr_gem->mem_regions = mem_regions;
-        }
-    }
-
-    if (bufmgr_gem)
-    {
-        atomic_dec(&bufmgr_gem->ref_count, 1);
     }
 
     return vram_regions;
 }
 
-bool __mos_has_vram_xe(int fd)
-{
-    return __mos_query_vram_region_count_xe(fd) > 0;
-}
-
 int mos_force_gt_reset_xe(int fd, int gt_id)
 {
     char reset_string[128];
@@ -587,7 +566,7 @@
     memclear(query);
     query.query = DRM_XE_DEVICE_QUERY_CONFIG;
     ret = drmIoctl(fd, DRM_IOCTL_XE_DEVICE_QUERY, (void *)&query);
-    if(ret || !query.size)
+    if (ret || !query.size)
     {
         return nullptr;
     }
@@ -614,51 +593,15 @@
     return config;
 }
 
-static struct drm_xe_query_gt_list *
-__mos_query_gt_list_xe(int fd)
-{
-    int ret = 0;
-    struct drm_xe_query_gt_list *gt_list;
-    struct drm_xe_device_query query;
-    memclear(query);
-    query.query = DRM_XE_DEVICE_QUERY_GT_LIST;
-
-    ret = drmIoctl(fd, DRM_IOCTL_XE_DEVICE_QUERY,
-                &query);
-    if(ret || !query.size)
-    {
-        return nullptr;
-    }
-
-    gt_list = (drm_xe_query_gt_list *)malloc(query.size);
-    if (gt_list != nullptr)
-    {
-        memset(gt_list, 0, query.size);
-    }
-    else
-    {
-        MOS_DRM_ASSERTMESSAGE("malloc gt_list failed");
-        return nullptr;
-    }
-
-    query.data = (uintptr_t)(gt_list);
-    ret = drmIoctl(fd, DRM_IOCTL_XE_DEVICE_QUERY,
-                &query);
-    if (ret || !query.size || 0 == gt_list->num_gt)
-    {
-        MOS_XE_SAFE_FREE(gt_list);
-        return nullptr;
-    }
-
-    return gt_list;
-}
-
 static int
-__mos_get_default_alignment_xe(struct mos_bufmgr *bufmgr, struct drm_xe_query_mem_regions *mem_regions)
+__mos_get_default_alignment_xe(struct mos_bufmgr *bufmgr)
 {
-    MOS_DRM_CHK_NULL_RETURN_VALUE(bufmgr, -EINVAL);
-    MOS_DRM_CHK_NULL_RETURN_VALUE(mem_regions, -EINVAL);
+    MOS_DRM_CHK_NULL_RETURN_VALUE(bufmgr, -EINVAL)
     struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *)bufmgr;
+    struct mos_xe_device *dev = &bufmgr_gem->xe_device;
+    int fd = bufmgr_gem->fd;
+    MOS_DRM_CHK_XE_DEV(dev, mem_regions, __mos_query_mem_regions_xe, -ENODEV)
+    struct drm_xe_query_mem_regions *mem_regions = dev->mem_regions;
     uint16_t mem_class;
 
     for (int i = 0; i < mem_regions->num_mem_regions; i++)
@@ -694,40 +637,70 @@
 {
     int ret = 0;
     struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *)bufmgr;
+    int fd = bufmgr_gem->fd;
+    struct mos_xe_device *dev = &bufmgr_gem->xe_device;
 
     if (bufmgr && version && version->uc_type < UC_TYPE_MAX)
     {
         /**
          * Note: query uc version from kmd if no historic data in bufmgr, otherwise using historic data.
          */
-        if (bufmgr_gem->uc_versions[version->uc_type].uc_type != version->uc_type)
+        if (dev->uc_versions[version->uc_type].uc_type != version->uc_type)
         {
             struct drm_xe_device_query query;
             memclear(query);
             query.size = sizeof(struct drm_xe_query_uc_fw_version);
             query.query = DRM_XE_DEVICE_QUERY_UC_FW_VERSION;
-            memclear(bufmgr_gem->uc_versions[version->uc_type]);
-            bufmgr_gem->uc_versions[version->uc_type].uc_type = version->uc_type;
-            query.data = (uintptr_t)&bufmgr_gem->uc_versions[version->uc_type];
+            memclear(dev->uc_versions[version->uc_type]);
+            dev->uc_versions[version->uc_type].uc_type = version->uc_type;
+            query.data = (uintptr_t)&dev->uc_versions[version->uc_type];
 
             ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_XE_DEVICE_QUERY,
                         &query);
             if (ret)
             {
-                memclear(bufmgr_gem->uc_versions[version->uc_type]);
-                bufmgr_gem->uc_versions[version->uc_type].uc_type = UC_TYPE_INVALID;
+                memclear(dev->uc_versions[version->uc_type]);
+                dev->uc_versions[version->uc_type].uc_type = UC_TYPE_INVALID;
                 MOS_DRM_ASSERTMESSAGE("Failed to query UC version, uc type: %d, errno: %d", version->uc_type, ret);
                 return ret;
             }
         }
 
-        version->major_version = bufmgr_gem->uc_versions[version->uc_type].major_ver;
-        version->minor_version = bufmgr_gem->uc_versions[version->uc_type].minor_ver;
+        version->major_version = dev->uc_versions[version->uc_type].major_ver;
+        version->minor_version = dev->uc_versions[version->uc_type].minor_ver;
     }
 
     return ret;
 }
 
+bool __mos_has_vram_xe(struct mos_bufmgr *bufmgr)
+{
+    MOS_DRM_CHK_NULL_RETURN_VALUE(bufmgr, 0)
+    struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *)bufmgr;
+    struct mos_xe_device *dev = &bufmgr_gem->xe_device;
+    int fd = bufmgr_gem->fd;
+    MOS_DRM_CHK_XE_DEV(dev, config, __mos_query_config_xe, 0)
+    struct drm_xe_query_config *config = dev->config;
+    bool has_vram = ((config->info[DRM_XE_QUERY_CONFIG_FLAGS] & DRM_XE_QUERY_CONFIG_FLAG_HAS_VRAM) > 0);
+    bufmgr_gem->has_vram = has_vram;
+    return has_vram;
+}
+
+uint8_t __mos_query_va_bits_xe(struct mos_bufmgr *bufmgr)
+{
+    uint8_t va_bits = 48;
+    MOS_DRM_CHK_NULL_RETURN_VALUE(bufmgr, va_bits)
+    struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *)bufmgr;
+    struct mos_xe_device *dev = &bufmgr_gem->xe_device;
+    int fd = bufmgr_gem->fd;
+    bufmgr_gem->va_bits = va_bits;
+    MOS_DRM_CHK_XE_DEV(dev, config, __mos_query_config_xe, va_bits)
+    struct drm_xe_query_config *config = dev->config;
+    va_bits = config->info[DRM_XE_QUERY_CONFIG_VA_BITS] & 0xff;
+    bufmgr_gem->va_bits = va_bits;
+    return va_bits;
+}
+
 static uint64_t
 mos_get_platform_information_xe(struct mos_bufmgr *bufmgr)
 {
@@ -738,7 +711,7 @@
 static void
 mos_set_platform_information_xe(struct mos_bufmgr *bufmgr, uint64_t p)
 {
-    if(bufmgr)
+    if (bufmgr)
         bufmgr->platform_information |= p;
 }
 
@@ -770,7 +743,7 @@
 __mos_bo_mark_mmaps_incoherent_xe(struct mos_linux_bo *bo)
 {
 #if HAVE_VALGRIND
-    struct mos_bo_gem *bo_gem = (struct mos_bo_gem *) bo;
+    struct mos_xe_bo_gem *bo_gem = (struct mos_xe_bo_gem *) bo;
 
     if (bo_gem->mem_virtual)
         VALGRIND_MAKE_MEM_NOACCESS(bo_gem->mem_virtual, bo->size);
@@ -817,7 +790,8 @@
 
     memclear(vm);
     ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_XE_VM_CREATE, &vm);
-    if (ret != 0) {
+    if (ret != 0)
+    {
         MOS_DRM_ASSERTMESSAGE("DRM_IOCTL_XE_VM_CREATE failed: %s",
             strerror(errno));
         return INVALID_VM;
@@ -842,7 +816,8 @@
     memclear(vm_destroy);
     vm_destroy.vm_id = vm_id;
     ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_XE_VM_DESTROY, &vm_destroy);
-    if (ret != 0) {
+    if (ret != 0)
+    {
         MOS_DRM_ASSERTMESSAGE("DRM_IOCTL_XE_VM_DESTROY failed: %s",
             strerror(errno));
     }
@@ -918,7 +893,7 @@
      * Set exec_queue timeslice for render/ compute only as WA to ensure exec sequence.
      * Note, this is caused by a potential issue in kmd since exec_queue preemption by plenty of WL w/ same priority.
      */
-    if((engine_class == DRM_XE_ENGINE_CLASS_RENDER
+    if ((engine_class == DRM_XE_ENGINE_CLASS_RENDER
                 || engine_class == DRM_XE_ENGINE_CLASS_COMPUTE)
                 && (ctx_width * num_placements == 1)
                 && bufmgr_gem->exec_queue_timeslice != EXEC_QUEUE_TIMESLICE_DEFAULT)
@@ -947,10 +922,10 @@
     context->engine_class = ((struct drm_xe_engine_class_instance *)engine_map)[0].engine_class;
     context->is_protected = bContextProtected;
     context->flags = flags;
-    context->cur_timeline_index = 0;
     context->ctx.bufmgr = bufmgr;
     context->ctx.vm_id = bufmgr_gem->vm_id;
     context->reset_count = 0;
+    context->timeline_dep = nullptr;
 
     bufmgr_gem->m_lock.lock();
     context->dummy_exec_queue_id = ++dummy_exec_queue_id;
@@ -974,10 +949,10 @@
 
     context->ctx.ctx_id = INVALID_EXEC_QUEUE_ID;
     context->ctx_width = 0;
-    context->cur_timeline_index = 0;
     context->ctx.bufmgr = bufmgr;
     context->ctx.vm_id = bufmgr_gem->vm_id;
     context->reset_count = 0;
+    context->timeline_dep = nullptr;
     context->dummy_exec_queue_id = INVALID_EXEC_QUEUE_ID;
     return &context->ctx;
 }
@@ -1003,7 +978,7 @@
     }
 
     struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *)(ctx->bufmgr);
-    if(nullptr == bufmgr_gem)
+    if (nullptr == bufmgr_gem)
     {
         return;
     }
@@ -1012,9 +987,8 @@
     int ret;
     bufmgr_gem->m_lock.lock();
     bufmgr_gem->sync_obj_rw_lock.lock();
-    mos_sync_clear_dep_queue(bufmgr_gem->fd, context->dep_queue_busy);
-    mos_sync_clear_dep_queue(bufmgr_gem->fd, context->dep_queue_free);
-    mos_sync_clear_dep_list(bufmgr_gem->fd, context->free_dep_tmp_list);
+    mos_sync_destroy_timeline_dep(bufmgr_gem->fd, context->timeline_dep);
+    context->timeline_dep = nullptr;
     bufmgr_gem->global_ctx_info.erase(context->dummy_exec_queue_id);
     bufmgr_gem->sync_obj_rw_lock.unlock();
     bufmgr_gem->m_lock.unlock();
@@ -1046,7 +1020,7 @@
 {
     MOS_DRM_CHK_NULL_RETURN_VALUE(bufmgr, -EINVAL);
     MOS_DRM_CHK_NULL_RETURN_VALUE(ctx, -EINVAL);
-    if(ctx->ctx_id == INVALID_EXEC_QUEUE_ID)
+    if (INVALID_EXEC_QUEUE_ID == ctx->ctx_id)
     {
         MOS_DRM_ASSERTMESSAGE("Unable to restore intel context, it is not supported");
         return -EINVAL;
@@ -1158,7 +1132,7 @@
     uint64_t offset = 0;
     uint64_t alignment = 0;
 
-    if(0 == bo->offset64)
+    if (0 == bo->offset64)
     {
         bufmgr_gem->m_lock.lock();
 
@@ -1172,12 +1146,12 @@
         {
             offset = __mos_bo_vma_alloc_xe(bo->bufmgr, (enum mos_memory_zone)bo_gem->mem_region, bo->size, PAGE_SIZE_2M);
         }
-        else if(MEMZONE_DEVICE == bo_gem->mem_region)
+        else if (MEMZONE_DEVICE == bo_gem->mem_region)
         {
             alignment = MAX(bufmgr_gem->default_alignment[MOS_XE_MEM_CLASS_VRAM], PAGE_SIZE_64K);
             offset = __mos_bo_vma_alloc_xe(bo->bufmgr, (enum mos_memory_zone)bo_gem->mem_region, bo->size, PAGE_SIZE_64K);
         }
-        else if(MEMZONE_SYS == bo_gem->mem_region)
+        else if (MEMZONE_SYS == bo_gem->mem_region)
         {
             alignment = MAX(bufmgr_gem->default_alignment[MOS_XE_MEM_CLASS_SYSMEM], PAGE_SIZE_64K);
             offset = __mos_bo_vma_alloc_xe(bo->bufmgr, (enum mos_memory_zone)bo_gem->mem_region, bo->size, PAGE_SIZE_64K);
@@ -1221,8 +1195,8 @@
     ret = drmIoctl(fd, DRM_IOCTL_XE_VM_BIND, &bind);
     if (ret)
     {
-        MOS_DRM_ASSERTMESSAGE("Failed to bind vm, vm_id:%d, exec_queue_id:%d, op:0x%x, flags:0x%x, bo_handle:%d, offset:%lx, addr:0x%lx, size:%ld, errno(%d)",
-            vm_id, exec_queue_id, op, bo_handle, offset, addr, size, -errno);
+        MOS_DRM_ASSERTMESSAGE("Failed to bind vm, vm_id:%d, exec_queue_id:%d, op:0x%x, flags:0x%x, bo_handle:%d, offset:%lx, addr:0x%lx, size:%ld, pat_index:%d, errno(%d)",
+            vm_id, exec_queue_id, op, flags, bo_handle, offset, addr, size, pat_index, -errno);
     }
 
     return ret;
@@ -1293,7 +1267,7 @@
     bo_gem->mem_region = MEMZONE_SYS;
     bo_align = MAX(alloc->alignment, bufmgr_gem->default_alignment[MOS_XE_MEM_CLASS_SYSMEM]);
 
-    if(bufmgr_gem->has_vram &&
+    if (bufmgr_gem->has_vram &&
             (MOS_MEMPOOL_VIDEOMEMORY == alloc->ext.mem_type || MOS_MEMPOOL_DEVICEMEMORY == alloc->ext.mem_type))
     {
         bo_gem->mem_region = MEMZONE_DEVICE;
@@ -1305,11 +1279,11 @@
     if (MEMZONE_DEVICE == bo_gem->mem_region)
     {
         //Note: memory_region is related to gt_id for multi-tiles gpu, take gt_id into consideration in case of multi-tiles
-        create.placement = bufmgr_gem->memory_regions & (~0x1);
+        create.placement = bufmgr_gem->mem_regions_mask & (~0x1);
     }
     else
     {
-        create.placement = bufmgr_gem->memory_regions & 0x1;
+        create.placement = bufmgr_gem->mem_regions_mask & 0x1;
     }
 
     //Note: We suggest vm_id=0 here as default, otherwise this bo cannot be exported as prelim fd.
@@ -1439,7 +1413,7 @@
 
     uint32_t alignment = bufmgr_gem->default_alignment[MOS_XE_MEM_CLASS_SYSMEM];
 
-    if(bufmgr_gem->has_vram &&
+    if (bufmgr_gem->has_vram &&
        (MOS_MEMPOOL_VIDEOMEMORY == alloc_tiled->ext.mem_type   || MOS_MEMPOOL_DEVICEMEMORY == alloc_tiled->ext.mem_type))
     {
         alignment = bufmgr_gem->default_alignment[MOS_XE_MEM_CLASS_VRAM];
@@ -1571,7 +1545,8 @@
 
     bufmgr_gem->m_lock.lock();
     ret = drmPrimeFDToHandle(bufmgr_gem->fd, prime_fd, &handle);
-    if (ret) {
+    if (ret)
+    {
         MOS_DRM_ASSERTMESSAGE("create_from_prime: failed to obtain handle from fd: %s", strerror(errno));
         bufmgr_gem->m_lock.unlock();
         return nullptr;
@@ -1582,11 +1557,11 @@
      * for named buffers, we must not create two bo's pointing at the same
      * kernel object
      */
-    for (list = bufmgr_gem->named.next;
-         list != &bufmgr_gem->named;
-         list = list->next) {
+    for (list = bufmgr_gem->named.next; list != &bufmgr_gem->named; list = list->next)
+    {
         bo_gem = DRMLISTENTRY(struct mos_xe_bo_gem, list, name_list);
-        if (bo_gem->gem_handle == handle) {
+        if (bo_gem->gem_handle == handle)
+        {
             mos_bo_reference_xe(&bo_gem->bo);
             bufmgr_gem->m_lock.unlock();
             return &bo_gem->bo;
@@ -1594,7 +1569,8 @@
     }
 
     bo_gem = MOS_New(mos_xe_bo_gem);
-    if (!bo_gem) {
+    if (!bo_gem)
+    {
         bufmgr_gem->m_lock.unlock();
         return nullptr;
     }
@@ -1743,7 +1719,7 @@
 mos_gem_bo_clear_exec_list_xe(struct mos_linux_bo *cmd_bo, int start)
 {
     MOS_UNUSED(start);
-    if(cmd_bo != nullptr && cmd_bo->bufmgr != nullptr)
+    if (cmd_bo != nullptr && cmd_bo->bufmgr != nullptr)
     {
         struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *) cmd_bo->bufmgr;
         struct mos_xe_bo_gem *bo_gem = (struct mos_xe_bo_gem *) cmd_bo;
@@ -1756,34 +1732,39 @@
     }
 }
 
+/**
+ * This is to dump all pending execution timeline done on such bo
+ */
 int
-__mos_dump_bo_wait_rendering_syncobj_xe(uint32_t bo_handle,
+__mos_dump_bo_wait_rendering_timeline_xe(uint32_t bo_handle,
             uint32_t *handles,
+            uint64_t *points,
             uint32_t count,
             int64_t timeout_nsec,
             uint32_t wait_flags,
             uint32_t rw_flags)
 {
 #if (_DEBUG || _RELEASE_INTERNAL)
-    if(__XE_TEST_DEBUG(XE_DEBUG_SYNCHRONIZATION))
+    if (__XE_TEST_DEBUG(XE_DEBUG_SYNCHRONIZATION))
     {
         MOS_DRM_CHK_NULL_RETURN_VALUE(handles, -EINVAL)
         char log_msg[MOS_MAX_MSG_BUF_SIZE] = { 0 };
         int offset = 0;
         offset += MOS_SecureStringPrint(log_msg + offset, MOS_MAX_MSG_BUF_SIZE,
                             MOS_MAX_MSG_BUF_SIZE - offset,
-                            "\n\t\t\tdump bo(handle=%d) wait rendering syncobj:",
-                            bo_handle);
-
-        for(int i = 0; i < count; i++)
-        {
-            offset += MOS_SecureStringPrint(log_msg + offset, MOS_MAX_MSG_BUF_SIZE,
-                            MOS_MAX_MSG_BUF_SIZE - offset,
-                            "\n\t\t\t-syncobj handle = %d, timeout_nsec = %ld, wait_flags = %d, rw_flags = %d",
-                            handles[i],
+                            "\n\t\t\tdump bo wait rendering: bo handle = %d, timeout_nsec = %ld, wait_flags = %d, rw_flags = %d",
+                            bo_handle,
                             timeout_nsec,
                             wait_flags,
                             rw_flags);
+
+        for (int i = 0; i < count; i++)
+        {
+            offset += MOS_SecureStringPrint(log_msg + offset, MOS_MAX_MSG_BUF_SIZE,
+                            MOS_MAX_MSG_BUF_SIZE - offset,
+                            "\n\t\t\t-syncobj handle = %d, timeline = %ld",
+                            handles[i],
+                            points[i]);
         }
 
         offset > MOS_MAX_MSG_BUF_SIZE ?
@@ -1835,14 +1816,14 @@
                 rw_flags);
     bufmgr_gem->m_lock.unlock();
 
-    for(auto it : timeline_data)
+    for (auto it : timeline_data)
     {
         handles.push_back(it.first);
         points.push_back(it.second);
     }
 
     count = handles.size();
-    if(count > 0)
+    if (count > 0)
     {
         ret = mos_sync_syncobj_timeline_wait(bufmgr_gem->fd,
                         handles.data(),
@@ -1851,6 +1832,14 @@
                         timeout_nsec,
                         wait_flags,
                         first_signaled);
+
+        __mos_dump_bo_wait_rendering_timeline_xe(bo_gem->gem_handle,
+                        handles.data(),
+                        points.data(),
+                        count,
+                        timeout_nsec,
+                        wait_flags,
+                        rw_flags);
     }
     bufmgr_gem->sync_obj_rw_lock.unlock_shared();
 
@@ -1904,7 +1893,7 @@
 static void
 mos_gem_bo_wait_rendering_xe(struct mos_linux_bo *bo)
 {
-    if(bo == nullptr || bo->bufmgr == nullptr)
+    if (bo == nullptr || bo->bufmgr == nullptr)
     {
         MOS_DRM_ASSERTMESSAGE("ptr is null pointer");
         return;
@@ -1916,7 +1905,6 @@
     uint32_t rw_flags = EXEC_OBJECT_READ_XE | EXEC_OBJECT_WRITE_XE;
 
     int ret =  __mos_gem_bo_wait_timeline_rendering_with_flags_xe(bo, timeout_nsec, wait_flags, rw_flags, nullptr);
-
     if (ret)
     {
         MOS_DRM_ASSERTMESSAGE("bo_wait_rendering_xe ret:%d, error:%d", ret, -errno);
@@ -1932,7 +1920,7 @@
 static int
 mos_gem_bo_wait_xe(struct mos_linux_bo *bo, int64_t timeout_ns)
 {
-    if(timeout_ns)
+    if (timeout_ns)
     {
         mos_gem_bo_wait_rendering_xe(bo);
         return 0;
@@ -1966,8 +1954,7 @@
     uint32_t rw_flags = write_enable ? EXEC_OBJECT_WRITE_XE : EXEC_OBJECT_READ_XE;
 
     ret =  __mos_gem_bo_wait_timeline_rendering_with_flags_xe(bo, timeout_nsec, wait_flags, rw_flags, nullptr);
-
-    if(ret)
+    if (ret)
     {
         MOS_DRM_ASSERTMESSAGE("bo wait rendering error(%d ns)", -errno);
     }
@@ -2056,12 +2043,17 @@
     return mos_bo_unmap_xe(bo);
 }
 
+/**
+ *This aims to dump the sync info on such execution.
+ *@syncs contains fence in from bo who has dependency on
+ *currect execution and a fence out in @dep from current execution.
+ */
 int __mos_dump_syncs_array_xe(struct drm_xe_sync *syncs,
             uint32_t count,
             mos_xe_dep *dep)
 {
 #if (_DEBUG || _RELEASE_INTERNAL)
-    if(__XE_TEST_DEBUG(XE_DEBUG_SYNCHRONIZATION))
+    if (__XE_TEST_DEBUG(XE_DEBUG_SYNCHRONIZATION))
     {
         MOS_DRM_CHK_NULL_RETURN_VALUE(syncs, -EINVAL)
         MOS_DRM_CHK_NULL_RETURN_VALUE(dep, -EINVAL)
@@ -2069,21 +2061,25 @@
         int offset = 0;
         offset += MOS_SecureStringPrint(log_msg + offset, MOS_MAX_MSG_BUF_SIZE,
                     MOS_MAX_MSG_BUF_SIZE - offset,
-                    "\n\t\t\tdump fence out syncobj: handle = %d, flags = %d",
-                    dep->sync.handle, dep->sync.flags);
-        if(count > 0)
+                    "\n\t\t\tdump fence out syncobj: handle = %d, timeline = %ld",
+                    dep->timeline_index);
+        if (count > 0)
         {
             offset += MOS_SecureStringPrint(log_msg + offset, MOS_MAX_MSG_BUF_SIZE,
                     MOS_MAX_MSG_BUF_SIZE - offset,
                     "\n\t\t\tdump exec syncs array, num sync = %d",
                     count);
         }
-        for(int i = 0; i < count; i++)
+        for (int i = 0; i < count; i++)
         {
+            /**
+             * Note: we assume all are timeline sync here, and change later when any other
+             * types sync in use.
+             */
             offset += MOS_SecureStringPrint(log_msg + offset, MOS_MAX_MSG_BUF_SIZE,
                     MOS_MAX_MSG_BUF_SIZE - offset,
-                    "\n\t\t\t-syncobj_handle = %d, flags=%d",
-                    syncs[i].handle, syncs[i].flags);
+                    "\n\t\t\t-syncobj_handle = %d, timeline = %ld, sync type = %d, sync flags = %d",
+                    syncs[i].handle, syncs[i].timeline_value, syncs[i].type, syncs[i].flags);
         }
         offset > MOS_MAX_MSG_BUF_SIZE ?
             MOS_DRM_NORMALMESSAGE("imcomplete dump since log msg buffer overwrite %s", log_msg) : MOS_DRM_NORMALMESSAGE("%s", log_msg);
@@ -2092,6 +2088,10 @@
     return MOS_XE_SUCCESS;
 }
 
+/**
+ * This is to dump timeline for each exec bo on such execution,
+ * pair of execed_queue_id & timeline_value will be dumped.
+ */
 int
 __mos_dump_bo_deps_map_xe(struct mos_linux_bo **bo,
             int num_bo,
@@ -2100,15 +2100,15 @@
             std::map<uint32_t, struct mos_xe_context*> ctx_infos)
 {
 #if (_DEBUG || _RELEASE_INTERNAL)
-    if(__XE_TEST_DEBUG(XE_DEBUG_SYNCHRONIZATION))
+    if (__XE_TEST_DEBUG(XE_DEBUG_SYNCHRONIZATION))
     {
         MOS_DRM_CHK_NULL_RETURN_VALUE(bo, -EINVAL)
         uint32_t exec_list_size = exec_list.size();
-        for(int i = 0; i < exec_list_size + num_bo; i++)
+        for (int i = 0; i < exec_list_size + num_bo; i++)
         {
             mos_xe_bo_gem *exec_bo_gem = nullptr;
             uint32_t exec_flags = 0;
-            if(i < exec_list_size)
+            if (i < exec_list_size)
             {
                 exec_bo_gem = (mos_xe_bo_gem *)exec_list[i].bo;
                 exec_flags = exec_list[i].flags;
@@ -2118,9 +2118,9 @@
                 exec_bo_gem = (mos_xe_bo_gem *)bo[i - exec_list_size];
                 exec_flags = EXEC_OBJECT_WRITE_XE; //use write flags for batch bo as default.
             }
-            if(exec_bo_gem)
+            if (exec_bo_gem)
             {
-                if(exec_bo_gem->is_imported || exec_bo_gem->is_exported)
+                if (exec_bo_gem->is_imported || exec_bo_gem->is_exported)
                 {
                     MOS_DRM_NORMALMESSAGE("\n\t\t\tdump external bo, handle=%d, without deps map, skip dump", exec_bo_gem->bo.handle);
                 }
@@ -2137,33 +2137,31 @@
                                     exec_flags);
 
                     auto it =  exec_bo_gem->read_deps.begin();
-                    while(it != exec_bo_gem->read_deps.end())
+                    while (it != exec_bo_gem->read_deps.end())
                     {
                         if (ctx_infos.count(it->first) > 0)
                         {
                             offset += MOS_SecureStringPrint(log_msg + offset, MOS_MAX_MSG_BUF_SIZE,
                                             MOS_MAX_MSG_BUF_SIZE - offset,
-                                            "\n\t\t\t-read deps: execed_exec_queue_id=%d, dep_status=%d, syncobj_handle=%d, sync_flags=%d",
+                                            "\n\t\t\t-read deps: execed_exec_queue_id=%d, syncobj_handle=%d", "timeline = %ld",
                                             it->first,
-                                            it->second.dep ? it->second.dep->status : -1,
-                                            it->second.dep ? it->second.dep->sync.handle : INVALID_HANDLE,
-                                            it->second.dep ? it->second.dep->sync.flags : -1);
+                                            it->second.dep ? it->second.dep->syncobj_handle : INVALID_HANDLE,
+                                            it->second.dep ? it->second.exec_timeline_index : INVALID_HANDLE);
                         }
                         it++;
                     }
 
                     it = exec_bo_gem->write_deps.begin();
-                    while(it != exec_bo_gem->write_deps.end())
+                    while (it != exec_bo_gem->write_deps.end())
                     {
                         if (ctx_infos.count(it->first) > 0)
                         {
                             offset += MOS_SecureStringPrint(log_msg + offset, MOS_MAX_MSG_BUF_SIZE,
                                             MOS_MAX_MSG_BUF_SIZE - offset,
-                                            "\n\t\t\t-write deps: execed_exec_queue_id=%d, dep_status=%d, syncobj_handle=%d, sync_flags=%d",
+                                            "\n\t\t\t-write deps: execed_exec_queue_id=%d, syncobj_handle=%d", "timeline = %ld",
                                             it->first,
-                                            it->second.dep ? it->second.dep->status : -1,
-                                            it->second.dep ? it->second.dep->sync.handle : INVALID_HANDLE,
-                                            it->second.dep ? it->second.dep->sync.flags : -1);
+                                            it->second.dep ? it->second.dep->syncobj_handle : INVALID_HANDLE,
+                                            it->second.dep ? it->second.exec_timeline_index : INVALID_HANDLE);
                         }
                         it++;
                     }
@@ -2184,7 +2182,6 @@
             struct mos_xe_context *ctx,
             std::vector<mos_xe_exec_bo> &exec_list,
             std::vector<struct drm_xe_sync> &syncs,
-            std::vector<mos_xe_dep*> &used_internal_deps,
             std::vector<struct mos_xe_external_bo_info> &external_bos)
 {
     MOS_DRM_CHK_NULL_RETURN_VALUE(ctx, -EINVAL);
@@ -2195,11 +2192,11 @@
     MOS_DRM_CHK_NULL_RETURN_VALUE(bufmgr_gem, -EINVAL);
     MOS_XE_GET_KEYS_FROM_MAP(bufmgr_gem->global_ctx_info, exec_queue_ids);
 
-    for(int i = 0; i < exec_list_size + num_bo; i++)
+    for (int i = 0; i < exec_list_size + num_bo; i++)
     {
         mos_xe_bo_gem *exec_bo_gem = nullptr;
         uint32_t exec_flags = 0;
-        if(i < exec_list_size)
+        if (i < exec_list_size)
         {
             //exec list bo
             exec_bo_gem = (mos_xe_bo_gem *)exec_list[i].bo;
@@ -2212,16 +2209,16 @@
             exec_flags = EXEC_OBJECT_WRITE_XE; //use write flags for batch bo as default
         }
 
-        if(exec_bo_gem)
+        if (exec_bo_gem)
         {
-            if(exec_flags == 0)
+            if (exec_flags == 0)
             {
                 //Add an assert message here in case of potential thread safety issue.
                 //Currently, exec bo's flags could only be in (0, EXEC_OBJECT_READ_XE | EXEC_OBJECT_WRITE_XE]
                 MOS_DRM_ASSERTMESSAGE("Invalid op flags(0x0) for exec bo(handle=%d)", exec_bo_gem->bo.handle);
             }
 
-            if(exec_bo_gem->is_imported || exec_bo_gem->is_exported)
+            if (exec_bo_gem->is_imported || exec_bo_gem->is_exported)
             {
                 //external bo, need to export its syncobj everytime.
                 int prime_fd = INVALID_HANDLE;
@@ -2231,7 +2228,7 @@
                             exec_flags,
                             syncs,
                             prime_fd);
-                if(ret == MOS_XE_SUCCESS)
+                if (ret == MOS_XE_SUCCESS)
                 {
                     /**
                      * Note, must import batch syncobj for each external bo
@@ -2278,11 +2275,11 @@
 {
     uint32_t exec_list_size = exec_list.size();
 
-    for(int i = 0; i < exec_list_size + num_bo; i++)
+    for (int i = 0; i < exec_list_size + num_bo; i++)
     {
         mos_xe_bo_gem *exec_bo_gem = nullptr;
         uint32_t exec_flags = 0;
-        if(i < exec_list_size)
+        if (i < exec_list_size)
         {
             //exec list bo
             exec_bo_gem = (mos_xe_bo_gem *)exec_list[i].bo;
@@ -2294,14 +2291,14 @@
             exec_bo_gem = (mos_xe_bo_gem *)bo[i - exec_list_size];
             exec_flags = EXEC_OBJECT_WRITE_XE; //use write flags for batch bo as default.
         }
-        if(exec_bo_gem)
+        if (exec_bo_gem)
         {
             mos_sync_update_bo_deps(curr_exec_queue_id, exec_flags, dep, exec_bo_gem->read_deps, exec_bo_gem->write_deps);
-            if(exec_flags & EXEC_OBJECT_READ_XE)
+            if (exec_flags & EXEC_OBJECT_READ_XE)
             {
                 exec_bo_gem->last_exec_read_exec_queue = curr_exec_queue_id;
             }
-            if(exec_flags & EXEC_OBJECT_WRITE_XE)
+            if (exec_flags & EXEC_OBJECT_WRITE_XE)
             {
                 exec_bo_gem->last_exec_write_exec_queue = curr_exec_queue_id;
             }
@@ -2336,7 +2333,7 @@
      * if exec_queue is banned, queried value is 1, otherwise it is zero;
      * if exec failure is not caused by exec_queue ban, umd could not help recover it.
      */
-    if(ret || !property_value)
+    if (ret || !property_value)
     {
         MOS_DRM_ASSERTMESSAGE("Failed to retore ctx(%d) with error(%d)",
                     curr_exec_queue_id, -EPERM);
@@ -2345,13 +2342,13 @@
 
     ret = __mos_context_restore_xe(bufmgr, ctx);
 
-    if(ret == MOS_XE_SUCCESS)
+    if (ret == MOS_XE_SUCCESS)
     {
         curr_exec_queue_id = ctx->ctx_id;
         exec.exec_queue_id = curr_exec_queue_id;
         //try once again to submit
         ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_XE_EXEC, &exec);
-        if(ret)
+        if (ret)
         {
             MOS_DRM_ASSERTMESSAGE("Failed to re-submission in DRM_IOCTL_XE_EXEC(errno:%d): new exec_queue_id = %d",
                         ret, curr_exec_queue_id);
@@ -2377,11 +2374,11 @@
  *     b) if flags & WRITE: get read_deps[all_exec_queue exclude ctx->dummy_exec_queue_id] & STATUS_DEP_BUSY
  *        and write_deps[last_write_exec_queue != ctx->dummy_exec_queue_id] & STATUS_DEP_BUSY;
  *  2. Export a syncobj from external bo as dep and add it indo syncs array.
- *  3. Get a new dep from the dep_queue_free and dep_queue_busy, and add it to syncs array;
- *      Note: if the new dep comes from dep_queue_busy, exec must wait and reset it.
+ *  3. Initial a new timeline dep object for exec queue if it doesn't have and add it to syncs array, otherwise add timeline
+ *     dep from context->timeline_dep directly while it has latest avaiable timeline point in it;
  *  4. Exec submittion with batches and syncs.
  *  5. Update read_deps[ctx->dummy_exec_queue_id] and write_deps[ctx->dummy_exec_queue_id] with the new deps from the dep_queue;
- *  6. Return back the dep to dep_queue_busy.
+ *  6. Update timeline dep's timeline index to be latest avaiable one for currect exec queue.
  *  7. Import syncobj from batch bo for each external bo's DMA buffer for external process to wait media process on demand.
  *  8. Close syncobj handle and syncobj fd for external bo to avoid leak.
  * GPU->CPU(optional):
@@ -2396,7 +2393,7 @@
 
     MOS_DRM_CHK_NULL_RETURN_VALUE(bo, -EINVAL)
     MOS_DRM_CHK_NULL_RETURN_VALUE(ctx, -EINVAL)
-    if(num_bo <= 0)
+    if (num_bo <= 0)
     {
         MOS_DRM_ASSERTMESSAGE("invalid batch bo num(%d)", num_bo);
         return -EINVAL;
@@ -2408,7 +2405,7 @@
     uint64_t batch_addrs[num_bo];
 
     std::vector<mos_xe_exec_bo> exec_list;
-    for(int i = 0; i < num_bo; i++)
+    for (int i = 0; i < num_bo; i++)
     {
         MOS_DRM_CHK_NULL_RETURN_VALUE(bo[i], -EINVAL)
         batch_addrs[i] = bo[i]->offset64;
@@ -2420,29 +2417,36 @@
     uint32_t curr_exec_queue_id = context->ctx.ctx_id;
     std::vector<struct mos_xe_external_bo_info> external_bos;
     std::vector<struct drm_xe_sync> syncs;
-    std::vector<mos_xe_dep*> used_internal_deps;
     uint64_t curr_timeline = 0;
     int ret = 0;
 
     uint32_t exec_list_size = exec_list.size();
-    if(exec_list_size == 0)
+    if (exec_list_size == 0)
     {
         MOS_DRM_NORMALMESSAGE("invalid exec list count(%d)", exec_list_size);
     }
 
     bufmgr_gem->m_lock.lock();
-    //get available timeline from engine queue and add it into syncs as fence out point.
-    struct mos_xe_dep *dep = mos_sync_update_exec_syncs_from_timeline_queue(
-                                    bufmgr_gem->fd,
-                                    context->dep_queue_busy,
-                                    syncs);
 
-    if(dep == nullptr)
+    if (context->timeline_dep == nullptr)
     {
-        MOS_DRM_ASSERTMESSAGE("Failed to get dep from queue");
-        bufmgr_gem->m_lock.unlock();
-        return -EINVAL;
+        context->timeline_dep = mos_sync_create_timeline_dep(bufmgr_gem->fd);
+
+        if (context->timeline_dep == nullptr)
+        {
+            MOS_DRM_ASSERTMESSAGE("Failed to initial context timeline dep");
+            bufmgr_gem->m_lock.unlock();
+            return -ENOMEM;
+        }
     }
+
+    struct mos_xe_dep *dep = context->timeline_dep;
+    //add latest avaiable timeline point(dep) into syncs as fence out point.
+    mos_sync_update_exec_syncs_from_timeline_dep(
+                          bufmgr_gem->fd,
+                          dep,
+                          syncs);
+
     bufmgr_gem->sync_obj_rw_lock.lock_shared();
     //update exec syncs array by external and interbal bo dep
     __mos_context_exec_update_syncs_xe(
@@ -2452,12 +2456,17 @@
                 context,
                 exec_list,
                 syncs,
-                used_internal_deps,
                 external_bos);
 
     //exec submit
     uint32_t sync_count = syncs.size();
     struct drm_xe_sync *syncs_array = syncs.data();
+
+    //dump bo deps map
+    __mos_dump_bo_deps_map_xe(bo, num_bo, exec_list, curr_exec_queue_id, bufmgr_gem->global_ctx_info);
+    //dump fence in and fence out info
+    __mos_dump_syncs_array_xe(syncs_array, sync_count, dep);
+
     struct drm_xe_exec exec;
     memclear(exec);
     exec.extensions = 0;
@@ -2471,23 +2480,18 @@
     exec.address = (num_bo == 1 ? (uintptr_t)batch_addrs[0] : (uintptr_t)batch_addrs);
     exec.num_batch_buffer = num_bo;
     ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_XE_EXEC, &exec);
-    if(ret)
+    if (ret)
     {
         MOS_DRM_ASSERTMESSAGE("Failed to submission in DRM_IOCTL_XE_EXEC(errno:%d): exec_queue_id = %d, num_syncs = %d, num_bo = %d",
                     -errno, curr_exec_queue_id, sync_count, num_bo);
 
         //check if it caused by guilty exec_queue_id, if so, could restore the exec_queue_id/ queue here and re-try exec again.
-        if(ret == -EPERM)
+        if (ret == -EPERM)
         {
             ret = __mos_bo_context_exec_retry_xe(&bufmgr_gem->bufmgr, ctx, exec, curr_exec_queue_id);
         }
     }
-    curr_timeline = dep->sync.timeline_value;
-
-    //dump fence in and fence out info
-    __mos_dump_syncs_array_xe(syncs_array, sync_count, dep);
-    //dump bo deps map
-    __mos_dump_bo_deps_map_xe(bo, num_bo, exec_list, curr_exec_queue_id, bufmgr_gem->global_ctx_info);
+    curr_timeline = dep->timeline_index;
 
     //update bos' read and write dep with new timeline
     __mos_context_exec_update_bo_deps_xe(bo, num_bo, exec_list, context->dummy_exec_queue_id, dep);
@@ -2503,33 +2507,33 @@
     int sync_file_fd = INVALID_HANDLE;
     int temp_syncobj = INVALID_HANDLE;
 
-    if(external_bo_count > 0)
+    if (external_bo_count > 0)
     {
         temp_syncobj = mos_sync_syncobj_create(bufmgr_gem->fd, 0);
-        if(temp_syncobj > 0)
+        if (temp_syncobj > 0)
         {
-            mos_sync_syncobj_timeline_to_binary(bufmgr_gem->fd, temp_syncobj, dep->sync.handle, curr_timeline, 0);
+            mos_sync_syncobj_timeline_to_binary(bufmgr_gem->fd, temp_syncobj, dep->syncobj_handle, curr_timeline, 0);
             sync_file_fd = mos_sync_syncobj_handle_to_syncfile_fd(bufmgr_gem->fd, temp_syncobj);
         }
     }
-    for(int i = 0; i < external_bo_count; i++)
+    for (int i = 0; i < external_bo_count; i++)
     {
         //import syncobj for external bos
-        if(sync_file_fd >= 0)
+        if (sync_file_fd >= 0)
         {
             mos_sync_import_syncfile_to_external_bo(bufmgr_gem->fd, external_bos[i].prime_fd, sync_file_fd);
         }
-        if(external_bos[i].prime_fd != INVALID_HANDLE)
+        if (external_bos[i].prime_fd != INVALID_HANDLE)
         {
             close(external_bos[i].prime_fd);
         }
         mos_sync_syncobj_destroy(bufmgr_gem->fd, external_bos[i].syncobj_handle);
     }
-    if(sync_file_fd >= 0)
+    if (sync_file_fd >= 0)
     {
         close(sync_file_fd);
     }
-    if(temp_syncobj > 0)
+    if (temp_syncobj > 0)
     {
         mos_sync_syncobj_destroy(bufmgr_gem->fd, temp_syncobj);
     }
@@ -2545,31 +2549,14 @@
 static int
 mos_get_devid_xe(struct mos_bufmgr *bufmgr)
 {
-    if (nullptr == bufmgr)
-    {
-        MOS_DRM_ASSERTMESSAGE("bufmgr is nullptr");
-        return 0;
-    }
     struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *)bufmgr;
-    struct drm_xe_query_config *config;
-    int devid = 0;
+    int fd = bufmgr_gem->fd;
+    struct mos_xe_device *dev = &bufmgr_gem->xe_device;
 
-    if (nullptr == bufmgr_gem->config)
-    {
-        bufmgr_gem->config = __mos_query_config_xe(bufmgr_gem->fd);
-    }
+    MOS_DRM_CHK_XE_DEV(dev, config, __mos_query_config_xe, 0)
+    struct drm_xe_query_config *config = dev->config;
 
-    config = bufmgr_gem->config;
-
-    if (nullptr == config)
-    {
-        MOS_DRM_ASSERTMESSAGE("Get config failed");
-        return devid;
-    }
-
-    devid = config->info[DRM_XE_QUERY_CONFIG_REV_AND_DEVICE_ID] & 0xffff;
-
-    return devid;
+    return (config->info[DRM_XE_QUERY_CONFIG_REV_AND_DEVICE_ID] & 0xffff);
 }
 
 static struct drm_xe_query_engines *
@@ -2591,20 +2578,15 @@
     query.data = 0;
 
     ret = drmIoctl(fd, DRM_IOCTL_XE_DEVICE_QUERY, &query);
-    if(ret || !query.size)
+    if (ret || !query.size)
     {
         MOS_DRM_ASSERTMESSAGE("ret:%d, length:%d", ret, query.size);
         return nullptr;
     }
 
-    engines = (drm_xe_query_engines *)malloc(query.size);
-    if (nullptr == engines)
-    {
-        MOS_DRM_ASSERTMESSAGE("malloc engines failed");
-        return nullptr;
-    }
+    engines = (drm_xe_query_engines *)calloc(1, query.size);
+    MOS_DRM_CHK_NULL_RETURN_VALUE(engines, nullptr)
 
-    memset(engines, 0, query.size);
     query.data = (uintptr_t)engines;
     ret = drmIoctl(fd, DRM_IOCTL_XE_DEVICE_QUERY, &query);
     if (ret || !query.size)
@@ -2620,18 +2602,15 @@
 static int
 mos_query_engines_count_xe(struct mos_bufmgr *bufmgr, unsigned int *nengine)
 {
-    struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *)bufmgr;
     MOS_DRM_CHK_NULL_RETURN_VALUE(nengine, -EINVAL);
+    struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *)bufmgr;
+    int fd = bufmgr_gem->fd;
+    struct mos_xe_device *dev = &bufmgr_gem->xe_device;
 
-    if (nullptr == bufmgr_gem->engines)
-    {
-        bufmgr_gem->engines = __mos_query_engines_xe(bufmgr_gem->fd);
-        MOS_DRM_CHK_NULL_RETURN_VALUE(bufmgr_gem->engines, -ENODEV);
-    }
+    MOS_DRM_CHK_XE_DEV(dev, engines, __mos_query_engines_xe, -ENODEV)
+    *nengine = dev->engines->num_engines;
 
-    *nengine = bufmgr_gem->engines->num_engines;
-
-    return 0;
+    return MOS_XE_SUCCESS;
 }
 
 int
@@ -2641,20 +2620,16 @@
                       unsigned int *nengine,
                       void *engine_map)
 {
-    struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *)bufmgr;
-    struct drm_xe_engine_class_instance *ci = (struct drm_xe_engine_class_instance *)engine_map;
-    struct drm_xe_query_engines *engines;
-
     MOS_DRM_CHK_NULL_RETURN_VALUE(nengine, -EINVAL);
     MOS_DRM_CHK_NULL_RETURN_VALUE(engine_map, -EINVAL);
 
-    if (nullptr == bufmgr_gem->engines)
-    {
-        bufmgr_gem->engines = __mos_query_engines_xe(bufmgr_gem->fd);
-        MOS_DRM_CHK_NULL_RETURN_VALUE(bufmgr_gem->engines, -ENODEV);
-    }
+    struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *)bufmgr;
+    struct drm_xe_engine_class_instance *ci = (struct drm_xe_engine_class_instance *)engine_map;
+    int fd = bufmgr_gem->fd;
+    struct mos_xe_device *dev = &bufmgr_gem->xe_device;
 
-    engines = bufmgr_gem->engines;
+    MOS_DRM_CHK_XE_DEV(dev, engines, __mos_query_engines_xe, -ENODEV)
+    struct drm_xe_query_engines *engines = dev->engines;
 
     int i, num;
     struct drm_xe_engine *engine;
@@ -2697,13 +2672,11 @@
     MOS_DRM_CHK_NULL_RETURN_VALUE(gfx_info, -EINVAL);
 
     struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *)bufmgr;
+    int fd = bufmgr_gem->fd;
+    struct mos_xe_device *dev = &bufmgr_gem->xe_device;
     int ret;
 
-    if (nullptr == bufmgr_gem->engines)
-    {
-        bufmgr_gem->engines = __mos_query_engines_xe(bufmgr_gem->fd);
-        MOS_DRM_CHK_NULL_RETURN_VALUE(bufmgr_gem->engines, -ENODEV);
-    }
+    MOS_DRM_CHK_XE_DEV(dev, engines, __mos_query_engines_xe, -ENODEV)
 
     if (0 == gfx_info->VDBoxInfo.NumberOfVDBoxEnabled
                 || 0 == gfx_info->VEBoxInfo.NumberOfVEBoxEnabled)
@@ -2711,18 +2684,18 @@
         unsigned int num_vd = 0;
         unsigned int num_ve = 0;
 
-        for (unsigned int i = 0; i < bufmgr_gem->engines->num_engines; i++)
+        for (unsigned int i = 0; i < dev->engines->num_engines; i++)
         {
             if (0 == gfx_info->VDBoxInfo.NumberOfVDBoxEnabled
-                        && bufmgr_gem->engines->engines[i].instance.engine_class == DRM_XE_ENGINE_CLASS_VIDEO_DECODE)
+                        && dev->engines->engines[i].instance.engine_class == DRM_XE_ENGINE_CLASS_VIDEO_DECODE)
             {
                 gfx_info->VDBoxInfo.Instances.VDBoxEnableMask |=
-                    1 << bufmgr_gem->engines->engines[i].instance.engine_instance;
+                    1 << dev->engines->engines[i].instance.engine_instance;
                 num_vd++;
             }
 
             if (0 == gfx_info->VEBoxInfo.NumberOfVEBoxEnabled
-                        && bufmgr_gem->engines->engines[i].instance.engine_class == DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE)
+                        && dev->engines->engines[i].instance.engine_class == DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE)
             {
                 num_ve++;
             }
@@ -2753,9 +2726,9 @@
     {
         struct drm_xe_engine_class_instance *_engine_map = (struct drm_xe_engine_class_instance *)engine_map;
         auto unselect_index = 0;
-        for(auto bit = 0; bit < *nengine; bit++)
+        for (auto bit = 0; bit < *nengine; bit++)
         {
-            if(((fixed_instance_mask >> bit) & 0x1) && (bit > unselect_index))
+            if (((fixed_instance_mask >> bit) & 0x1) && (bit > unselect_index))
             {
                 _engine_map[unselect_index].engine_class = _engine_map[bit].engine_class;
                 _engine_map[unselect_index].engine_instance = _engine_map[bit].engine_instance;
@@ -2767,11 +2740,11 @@
                 _engine_map[bit].pad = 0;
                 unselect_index++;
             }
-            else if(((fixed_instance_mask >> bit) & 0x1) && (bit == unselect_index))
+            else if (((fixed_instance_mask >> bit) & 0x1) && (bit == unselect_index))
             {
                 unselect_index++;
             }
-            else if(!((fixed_instance_mask >> bit) & 0x1))
+            else if (!((fixed_instance_mask >> bit) & 0x1))
             {
                 _engine_map[bit].engine_class = 0;
                 _engine_map[bit].engine_instance = 0;
@@ -2789,40 +2762,36 @@
 
 }
 
+
+/**
+ * Note: xe kmd doesn't support query blob before dg2.
+ */
 static uint32_t *
-__mos_query_hw_config_xe(int fd, uint32_t* config_len)
+__mos_query_hw_config_xe(int fd)
 {
     struct drm_xe_device_query query;
     uint32_t *hw_config;
     int ret;
 
-    if (fd < 0 || nullptr == config_len)
+    if (fd < 0)
     {
         return nullptr;
     }
 
-    *config_len = 0;
-
     memclear(query);
     query.query = DRM_XE_DEVICE_QUERY_HWCONFIG;
 
     ret = drmIoctl(fd, DRM_IOCTL_XE_DEVICE_QUERY, &query);
-    if(ret || !query.size)
+    if (ret || !query.size)
     {
         MOS_DRM_ASSERTMESSAGE("ret:%d, length:%d", ret, query.size);
         return nullptr;
     }
 
-    hw_config = (uint32_t *)malloc(query.size);
-    if (hw_config == nullptr)
-    {
-        MOS_DRM_ASSERTMESSAGE("malloc hw_config failed");
-        return nullptr;
-    }
+    hw_config = (uint32_t *)calloc(1, query.size + sizeof(uint32_t));
+    MOS_DRM_CHK_NULL_RETURN_VALUE(hw_config, nullptr)
 
-    memset(hw_config, 0, query.size);
-
-    query.data = (uintptr_t)hw_config;
+    query.data = (uintptr_t)&hw_config[1];
     ret = drmIoctl(fd, DRM_IOCTL_XE_DEVICE_QUERY, &query);
     if (ret != 0 || query.size <= 0)
     {
@@ -2831,37 +2800,27 @@
         return nullptr;
     }
 
-    *config_len = query.size / sizeof(uint32_t);
+    hw_config[0] = query.size / sizeof(uint32_t);
 
     return hw_config;
 }
 
-
 static int
 mos_query_device_blob_xe(struct mos_bufmgr *bufmgr, MEDIA_SYSTEM_INFO* gfx_info)
 {
+    MOS_DRM_CHK_NULL_RETURN_VALUE(gfx_info, -EINVAL)
+
     struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *)bufmgr;
-    struct drm_xe_device_query query;
-    uint32_t *hwconfig;
+    int fd = bufmgr_gem->fd;
+    struct mos_xe_device *dev = &bufmgr_gem->xe_device;
 
-    if (nullptr == gfx_info)
-    {
-        return -EINVAL;
-    }
+    MOS_DRM_CHK_XE_DEV(dev, hw_config, __mos_query_hw_config_xe, -ENODEV)
 
-    if (nullptr == bufmgr_gem->hw_config)
-    {
-        bufmgr_gem->hw_config = __mos_query_hw_config_xe(bufmgr_gem->fd, &bufmgr_gem->config_len);
-        if (nullptr == bufmgr_gem->hw_config)
-        {
-            return -ENODEV;
-        }
-    }
-
-    hwconfig = bufmgr_gem->hw_config;
+    uint32_t *hwconfig = &dev->hw_config[1];
+    uint32_t num_config = dev->hw_config[0];
 
     int i = 0;
-    while (i < bufmgr_gem->config_len) {
+    while (i < num_config) {
         /* Attribute ID starts with 1 */
         assert(hwconfig[i] > 0);
 
@@ -2937,7 +2896,7 @@
     struct drm_gem_close close_ioctl;
     int ret;
 
-    if(nullptr == bo_gem)
+    if (nullptr == bo_gem)
     {
         MOS_DRM_ASSERTMESSAGE("bo == nullptr");
         return;
@@ -2945,7 +2904,7 @@
 
     bufmgr_gem = (struct mos_xe_bufmgr_gem *) bo->bufmgr;
 
-    if(nullptr == bufmgr_gem)
+    if (nullptr == bufmgr_gem)
     {
         MOS_DRM_ASSERTMESSAGE("bufmgr_gem == nullptr");
         return;
@@ -2959,12 +2918,13 @@
     {
         if (bo_gem->mem_virtual)
         {
-            VG(VALGRIND_FREELIKE_BLOCK(bo_gem->mem_virtual, 0));
+            VG(VALGRIND_MAKE_MEM_NOACCESS(bo_gem->mem_virtual, 0));
             drm_munmap(bo_gem->mem_virtual, bo_gem->bo.size);
+            bo_gem->mem_virtual = nullptr;
         }
     }
 
-    if(bo->vm_id != INVALID_VM)
+    if (bo->vm_id != INVALID_VM)
     {
         ret = mos_vm_bind_sync_xe(bufmgr_gem->fd,
                     bo->vm_id,
@@ -3035,6 +2995,7 @@
         return;
 
     struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *) bufmgr;
+    struct mos_xe_device *dev = &bufmgr_gem->xe_device;
     int i, ret;
 
     /* Release userptr bo kept hanging around for optimisation. */
@@ -3054,20 +3015,20 @@
         close(bufmgr_gem->mem_profiler_fd);
     }
 
-    MOS_XE_SAFE_FREE(bufmgr_gem->hw_config)
-    bufmgr_gem->hw_config = nullptr;
+    MOS_XE_SAFE_FREE(dev->hw_config);
+    dev->hw_config = nullptr;
 
-    MOS_XE_SAFE_FREE(bufmgr_gem->config);
-    bufmgr_gem->config = nullptr;
+    MOS_XE_SAFE_FREE(dev->config);
+    dev->config = nullptr;
 
-    MOS_XE_SAFE_FREE(bufmgr_gem->engines);
-    bufmgr_gem->engines = nullptr;
+    MOS_XE_SAFE_FREE(dev->engines);
+    dev->engines = nullptr;
 
-    MOS_XE_SAFE_FREE(bufmgr_gem->mem_regions);
-    bufmgr_gem->mem_regions = nullptr;
+    MOS_XE_SAFE_FREE(dev->mem_regions);
+    dev->mem_regions = nullptr;
 
-    MOS_XE_SAFE_FREE(bufmgr_gem->gt_list);
-    bufmgr_gem->gt_list = nullptr;
+    MOS_XE_SAFE_FREE(dev->gt_list);
+    dev->gt_list = nullptr;
 
     MOS_Delete(bufmgr_gem);
 }
@@ -3119,11 +3080,11 @@
     MOS_DRM_CHK_NULL_RETURN_VALUE(ctx, -EINVAL);
 
     struct mos_xe_context *context = (struct mos_xe_context *)ctx;
-    if(reset_count)
+    if (reset_count)
         *reset_count = context->reset_count;
-    if(active)
+    if (active)
         *active = 0;
-    if(pending)
+    if (pending)
         *pending = 0;
     return 0;
 }
@@ -3131,7 +3092,7 @@
 static mos_oca_exec_list_info*
 mos_bo_get_oca_exec_list_info_xe(struct mos_linux_bo *bo, int *count)
 {
-    if(nullptr == bo  || nullptr == count)
+    if (nullptr == bo  || nullptr == count)
     {
         return nullptr;
     }
@@ -3143,24 +3104,24 @@
     struct mos_xe_bo_gem *bo_gem = (struct mos_xe_bo_gem *)bo;
     int exec_list_count = bo_gem->exec_list.size();
 
-    if(exec_list_count == 0 || exec_list_count > MAX_COUNT)
+    if (exec_list_count == 0 || exec_list_count > MAX_COUNT)
     {
         return nullptr;
     }
 
     info = (mos_oca_exec_list_info *)malloc((exec_list_count + 1) * sizeof(mos_oca_exec_list_info));
-    if(!info)
+    if (!info)
     {
         MOS_DRM_ASSERTMESSAGE("malloc mos_oca_exec_list_info failed");
         return info;
     }
 
-    for(auto &it : bo_gem->exec_list)
+    for (auto &it : bo_gem->exec_list)
     {
         /*note: set capture for each bo*/
         struct mos_xe_bo_gem *exec_bo_gem = (struct mos_xe_bo_gem *)it.second.bo;
         uint32_t exec_flags = it.second.flags;
-        if(exec_bo_gem)
+        if (exec_bo_gem)
         {
             info[counter].handle   = exec_bo_gem->bo.handle;
             info[counter].size     = exec_bo_gem->bo.size;
@@ -3208,16 +3169,13 @@
 static int
 mos_get_driver_info_xe(struct mos_bufmgr *bufmgr, struct LinuxDriverInfo *drvInfo)
 {
-    if (nullptr == bufmgr || nullptr == drvInfo)
-    {
-        return -EINVAL;
-    }
-    uint32_t *hw_config = nullptr;
+    MOS_DRM_CHK_NULL_RETURN_VALUE(drvInfo, -EINVAL)
+    struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *)bufmgr;
+    struct mos_xe_device *dev = &bufmgr_gem->xe_device;
+    int fd = bufmgr_gem->fd;
+
     uint32_t MaxEuPerSubSlice = 0;
     int i = 0;
-    struct drm_xe_query_engines *engines = nullptr;
-    struct drm_xe_query_config *config = nullptr;
-    struct mos_xe_bufmgr_gem *bufmgr_gem = (struct mos_xe_bufmgr_gem *)bufmgr;
     drvInfo->hasBsd = 1;
     drvInfo->hasBsd2 = 1;
     drvInfo->hasVebox = 1;
@@ -3225,15 +3183,21 @@
     //For XE driver always has ppgtt
     drvInfo->hasPpgtt = 1;
 
-    // Step1: Get hw_config
-    if (nullptr == bufmgr_gem->hw_config)
+    /**
+     * query blob
+     * Note: xe kmd doesn't support query blob before dg2, so don't check null and return here.
+     */
+    if (dev->hw_config == nullptr)
     {
-        bufmgr_gem->hw_config = __mos_query_hw_config_xe(bufmgr_gem->fd, &bufmgr_gem->config_len);
+        dev->hw_config = __mos_query_hw_config_xe(fd);
     }
-    hw_config = bufmgr_gem->hw_config;
-    if (hw_config)
+
+    if (dev->hw_config)
     {
-        while (i < bufmgr_gem->config_len)
+        uint32_t *hw_config = &dev->hw_config[1];
+        uint32_t num_config = dev->hw_config[0];
+
+        while (i < num_config)
         {
             /* Attribute ID starts with 1 */
             assert(hw_config[i] > 0);
@@ -3273,69 +3237,51 @@
         drvInfo->sliceCount = 1;
     }
 
-    // Step2: engines
-    if (nullptr == bufmgr_gem->engines)
-    {
-        bufmgr_gem->engines = __mos_query_engines_xe(bufmgr_gem->fd);
-        if (nullptr == bufmgr_gem->engines)
-        {
-            MOS_DRM_ASSERTMESSAGE("get engines failed");
-            return -ENODEV;
-        }
-    }
-
-    engines = bufmgr_gem->engines;
-    int engine_class_num;
-    for (i = 0, engine_class_num = 0; i < engines->num_engines; i++)
+    // query engines info
+    MOS_DRM_CHK_XE_DEV(dev, engines, __mos_query_engines_xe, -ENODEV)
+    struct drm_xe_query_engines *engines = dev->engines;
+    int num_vd = 0;
+    int num_ve = 0;
+    for (i = 0; i < engines->num_engines; i++)
     {
         if (DRM_XE_ENGINE_CLASS_VIDEO_DECODE == engines->engines[i].instance.engine_class)
         {
-            engine_class_num++;
+            num_vd++;
+        }
+        else if (DRM_XE_ENGINE_CLASS_VIDEO_ENHANCE == engines->engines[i].instance.engine_class)
+        {
+            num_ve++;
         }
     }
-    if (engine_class_num >= 1)
+
+    if (num_vd >= 1)
     {
         drvInfo->hasBsd = 1;
     }
-    if (engine_class_num >= 2)
+
+    if (num_vd >= 2)
     {
         drvInfo->hasBsd2 = 1;
     }
 
-    for (i = 0, engine_class_num = 0; i < engines->num_engines; i++)
-    {
-        if (DRM_XE_ENGINE_CLASS_VIDEO_DECODE == engines->engines[i].instance.engine_class)
-        {
-            engine_class_num++;
-        }
-    }
-    if (engine_class_num  >= 1)
+    if (num_ve  >= 1)
     {
         drvInfo->hasVebox = 1;
     }
 
-    // Step3: Get config
-    if (nullptr == bufmgr_gem->config)
-    {
-        bufmgr_gem->config = __mos_query_config_xe(bufmgr_gem->fd);
-        if (nullptr == bufmgr_gem->config)
-        {
-            MOS_DRM_ASSERTMESSAGE("get config failed");
-            return -ENODEV;
-        }
-    }
-    config = bufmgr_gem->config;
-
     drvInfo->hasHuc = 1;
     if (1 == drvInfo->hasHuc)
     {
         drvInfo->hasProtectedHuc = 1;
     }
 
+    // query config
+    MOS_DRM_CHK_XE_DEV(dev, config, __mos_query_config_xe, -ENODEV)
+    struct drm_xe_query_config *config = dev->config;
     drvInfo->devId = config->info[DRM_XE_QUERY_CONFIG_REV_AND_DEVICE_ID] & 0xffff;
     drvInfo->devRev = config->info[DRM_XE_QUERY_CONFIG_REV_AND_DEVICE_ID] >> 16;
 
-    return 0;
+    return MOS_XE_SUCCESS;
 }
 
 /**
@@ -3350,7 +3296,7 @@
     //Note: don't put this field in bufmgr in case of bufmgr inaccessable in some functions
 #if (_DEBUG || _RELEASE_INTERNAL)
     MOS_READ_ENV_VARIABLE(INTEL_XE_BUFMGR_DEBUG, MOS_USER_FEATURE_VALUE_TYPE_INT64, __xe_bufmgr_debug__);
-    if(__xe_bufmgr_debug__ < 0)
+    if (__xe_bufmgr_debug__ < 0)
     {
         __xe_bufmgr_debug__ = 0;
     }
@@ -3358,6 +3304,7 @@
 
     struct mos_xe_bufmgr_gem *bufmgr_gem;
     int ret, tmp;
+    struct mos_xe_device *dev = nullptr;
 
     pthread_mutex_lock(&bufmgr_list_mutex);
 
@@ -3370,6 +3317,8 @@
         goto exit;
 
     bufmgr_gem->bufmgr = {};
+    bufmgr_gem->xe_device = {};
+    dev = &bufmgr_gem->xe_device;
 
     bufmgr_gem->fd = fd;
     bufmgr_gem->vm_id = INVALID_VM;
@@ -3418,7 +3367,6 @@
     bufmgr_gem->bufmgr.has_bsd2= mos_has_bsd2_xe;
     bufmgr_gem->bufmgr.set_object_capture = mos_bo_set_object_capture_xe;
     bufmgr_gem->bufmgr.set_object_async = mos_bo_set_object_async_xe;
-
     bufmgr_gem->bufmgr.bo_context_exec3 = mos_bo_context_exec_with_sync_xe;
 
     bufmgr_gem->exec_queue_timeslice = EXEC_QUEUE_TIMESLICE_DEFAULT;
@@ -3448,47 +3396,13 @@
         }
     }
 
-    bufmgr_gem->uc_versions[UC_TYPE_GUC_SUBMISSION].uc_type = UC_TYPE_INVALID;
-    bufmgr_gem->uc_versions[UC_TYPE_HUC].uc_type = UC_TYPE_INVALID;
+    dev->uc_versions[UC_TYPE_GUC_SUBMISSION].uc_type = UC_TYPE_INVALID;
+    dev->uc_versions[UC_TYPE_HUC].uc_type = UC_TYPE_INVALID;
 
     bufmgr_gem->vm_id = __mos_vm_create_xe(&bufmgr_gem->bufmgr);
-    bufmgr_gem->config = __mos_query_config_xe(fd);
-    bufmgr_gem->gt_list = __mos_query_gt_list_xe(fd);
-    bufmgr_gem->memory_regions = __mos_query_memory_regions_xe(fd);
-    bufmgr_gem->mem_regions = __mos_query_mem_regions_xe(fd);
-    bufmgr_gem->has_vram = __mos_has_vram_xe(fd);
-    bufmgr_gem->hw_config = __mos_query_hw_config_xe(fd, &bufmgr_gem->config_len);
-
-    if (bufmgr_gem->mem_regions != nullptr)
-    {
-        __mos_get_default_alignment_xe(&bufmgr_gem->bufmgr, bufmgr_gem->mem_regions);
-    }
-
-    bufmgr_gem->engines = __mos_query_engines_xe(fd);
-    if (nullptr == bufmgr_gem->engines)
-    {
-        MOS_DRM_ASSERTMESSAGE("Failed to query engines");
-
-        if (bufmgr_gem->mem_profiler_fd != -1)
-        {
-            close(bufmgr_gem->mem_profiler_fd);
-        }
-
-        MOS_XE_SAFE_FREE(bufmgr_gem->hw_config)
-        bufmgr_gem->hw_config = nullptr;
-
-        MOS_XE_SAFE_FREE(bufmgr_gem->config);
-        bufmgr_gem->config = nullptr;
-
-        MOS_XE_SAFE_FREE(bufmgr_gem->mem_regions);
-        bufmgr_gem->mem_regions = nullptr;
-
-        MOS_XE_SAFE_FREE(bufmgr_gem->gt_list);
-        bufmgr_gem->gt_list = nullptr;
-
-        MOS_Delete(bufmgr_gem);
-        goto exit;
-    }
+    __mos_query_mem_regions_instance_mask_xe(&bufmgr_gem->bufmgr);
+    __mos_has_vram_xe(&bufmgr_gem->bufmgr);
+    __mos_get_default_alignment_xe(&bufmgr_gem->bufmgr);
 
     DRMLISTADD(&bufmgr_gem->managers, &bufmgr_list);
     DRMINITLISTHEAD(&bufmgr_gem->named);
@@ -3509,38 +3423,11 @@
     {
         return -EINVAL;
     }
-    struct drm_xe_query_config *config = nullptr;
-    bool needFreeConfig = false;
-    pthread_mutex_lock(&bufmgr_list_mutex);
-    struct mos_xe_bufmgr_gem *bufmgr_gem = mos_bufmgr_gem_find(fd);
-    pthread_mutex_unlock(&bufmgr_list_mutex);
-    if (bufmgr_gem != nullptr)
-    {
-        if (nullptr == bufmgr_gem->config)
-        {
-            bufmgr_gem->config = __mos_query_config_xe(fd);
-        }
-        config = bufmgr_gem->config;
-        needFreeConfig = false;
-    }
-    else
-    {
-        config = __mos_query_config_xe(fd);
-        needFreeConfig = true;
-    }
+    struct drm_xe_query_config *config = __mos_query_config_xe(fd);
+    MOS_DRM_CHK_NULL_RETURN_VALUE(config, -ENODEV)
 
-    if (nullptr == config)
-    {
-        MOS_DRM_ASSERTMESSAGE("get config failed\n");
-        mos_bufmgr_gem_unref_xe((struct mos_bufmgr *)bufmgr_gem);
-        return -ENODEV;
-    }
     *device_id = config->info[DRM_XE_QUERY_CONFIG_REV_AND_DEVICE_ID] & 0xffff;
+    MOS_XE_SAFE_FREE(config);
 
-    mos_bufmgr_gem_unref_xe((struct mos_bufmgr *)bufmgr_gem);
-    if (needFreeConfig)
-    {
-        MOS_XE_SAFE_FREE(config);
-    }
-    return 0;
+    return MOS_XE_SUCCESS;
 }
diff --git a/media_softlet/linux/common/os/xe/mos_synchronization_xe.c b/media_softlet/linux/common/os/xe/mos_synchronization_xe.c
index 4af2c25..8762de3 100644
--- a/media_softlet/linux/common/os/xe/mos_synchronization_xe.c
+++ b/media_softlet/linux/common/os/xe/mos_synchronization_xe.c
@@ -426,30 +426,29 @@
 }
 
 /**
- * Get a dep from the queue to use as timeline fence out syncobj;
+ * Initial a new timeline dep object.
  *
  * @fd indicates to opened device;
- * @queue_busy indicates to busy queue in ctx, each ctx only contains one timeline syncobj in busy queue for each submission;
  *
- * @return indicates to timeline dep found from the queue; caller should alway check whether returned dep is nullptr.
+ * @return indicates to a new timeline deo object
  */
-struct mos_xe_dep *mos_sync_get_timeline_dep_from_queue(int fd,
-            std::queue<struct mos_xe_dep*> &queue_busy)
+struct mos_xe_dep *mos_sync_create_timeline_dep(int fd)
 {
     struct mos_xe_dep *dep = nullptr;
+    //create new one
+    dep = (struct mos_xe_dep *)calloc(1, sizeof(struct mos_xe_dep));
+    MOS_DRM_CHK_NULL_RETURN_VALUE(dep, nullptr);
+    int handle = mos_sync_syncobj_create(fd, 0);
 
-    if (!queue_busy.empty())
+    if (handle > 0)
     {
-        dep = queue_busy.front();
+        dep->syncobj_handle = handle;
+        dep->timeline_index = 1;
     }
     else
     {
-        //create new one and push it into queue_busy
-        dep = (struct mos_xe_dep *)calloc(1, sizeof(struct mos_xe_dep));
-        MOS_DRM_CHK_NULL_RETURN_VALUE(dep, nullptr);
-        dep->sync.handle = mos_sync_syncobj_create(fd, 0);
-        dep->timeline_index = 1;
-        queue_busy.push(dep);
+        MOS_XE_SAFE_FREE(dep)
+        return nullptr;
     }
 
     return dep;
@@ -469,47 +468,22 @@
 }
 
 /**
- * Destroy the syncobj and clear the queue.
+ * Destroy the syncobj and timeline dep object
  *
  * @fd indicates to opened device
- * @queue indicates to the queue that needs to clear
+ * @dep indicates to the timeline dep object in its context
  *
  */
-void mos_sync_clear_dep_queue(int fd, std::queue<struct mos_xe_dep*> &queue)
+void mos_sync_destroy_timeline_dep(int fd, struct mos_xe_dep* dep)
 {
-    while(!queue.empty())
+    if (dep)
     {
-        struct mos_xe_dep *dep = queue.front();
-        queue.pop();
-        if(dep)
-        {
-            mos_sync_syncobj_destroy(fd, dep->sync.handle);
-            MOS_XE_SAFE_FREE(dep)
-        }
+        mos_sync_syncobj_destroy(fd, dep->syncobj_handle);
+        MOS_XE_SAFE_FREE(dep)
     }
 }
 
 /**
- * Clear free tmp dep list
- *
- * @fd indicates to opened device
- * @temp_list indicates to sync objs
- *
- */
-void mos_sync_clear_dep_list(int fd, std::list<struct mos_xe_dep*> &temp_list)
-{
-    for (auto dep : temp_list)
-    {
-        if(dep)
-        {
-            mos_sync_syncobj_destroy(fd, dep->sync.handle);
-            MOS_XE_SAFE_FREE(dep)
-        }
-    }
-    temp_list.clear();
-}
-
-/**
  * Add the timeline dep from read and write dep map into exec syncs array.
  *
  * @curr_engine indicates to current exec engine id;
@@ -538,11 +512,11 @@
         if (write_deps.count(lst_write_engine) > 0
                 && engine_ids.count(lst_write_engine) > 0)
         {
-            if(write_deps[lst_write_engine].dep)
+            if (write_deps[lst_write_engine].dep)
             {
                 drm_xe_sync sync;
                 memclear(sync);
-                sync.handle = write_deps[lst_write_engine].dep->sync.handle;
+                sync.handle = write_deps[lst_write_engine].dep->syncobj_handle;
                 sync.type = DRM_XE_SYNC_TYPE_TIMELINE_SYNCOBJ;
                 sync.timeline_value = write_deps[lst_write_engine].exec_timeline_index;
                 syncs.push_back(sync);
@@ -560,11 +534,11 @@
             if (engine_id != curr_engine
                     && engine_ids.count(engine_id) > 0)
             {
-                if(it->second.dep)
+                if (it->second.dep)
                 {
                     drm_xe_sync sync;
                     memclear(sync);
-                    sync.handle = it->second.dep->sync.handle;
+                    sync.handle = it->second.dep->syncobj_handle;
                     sync.type = DRM_XE_SYNC_TYPE_TIMELINE_SYNCOBJ;
                     sync.timeline_value = it->second.exec_timeline_index;
                     syncs.push_back(sync);
@@ -611,36 +585,28 @@
 }
 
 /**
- * Add the timeline dep from ctx busy queue into exec syncs array.
+ * Add the timeline dep from its context into exec syncs array for fence out.
  *
  * @fd indicates to opened device;
- * @queue_busy indicates to ctx timeline fence queue.
+ * @dep indicates to a timeline dep in its context for fence out on current submission.
  * @syncs indicates to exec syncs array for current exec; timeline dep from queue is used as fence out.
- * @return indicates to the timeline dep got from queue, caller must update this dep->timeline_index into read_deps or write_deps after exec.
  *
  */
-struct mos_xe_dep *mos_sync_update_exec_syncs_from_timeline_queue(int fd,
-            std::queue<struct mos_xe_dep*> &queue_busy,
+void mos_sync_update_exec_syncs_from_timeline_dep(int fd,
+            struct mos_xe_dep *dep,
             std::vector<struct drm_xe_sync> &syncs)
 {
-    struct mos_xe_dep *dep =
-        mos_sync_get_timeline_dep_from_queue(fd, queue_busy);
-
-    MOS_DRM_CHK_NULL_RETURN_VALUE(dep, nullptr)
-
     if (dep)
     {
         drm_xe_sync sync;
         memclear(sync);
         //must set DRM_XE_SYNC_FLAG_SIGNAL for timeline fence out syncobj.
-        sync.handle = dep->sync.handle;
+        sync.handle = dep->syncobj_handle;
         sync.timeline_value = dep->timeline_index;
         sync.flags = DRM_XE_SYNC_FLAG_SIGNAL;
         sync.type = DRM_XE_SYNC_TYPE_TIMELINE_SYNCOBJ;
         syncs.push_back(sync);
     }
-
-    return dep;
 }
 
 /**
@@ -705,7 +671,7 @@
             if (it->second.dep && engine_ids.count(engine_id) > 0)
             {
                 // Save the max timeline data
-                max_timeline_data[it->second.dep->sync.handle] = bo_exec_timeline;
+                max_timeline_data[it->second.dep->syncobj_handle] = bo_exec_timeline;
             }
         }
     }
@@ -715,7 +681,7 @@
         && write_deps.count(lst_write_engine) > 0
        && write_deps[lst_write_engine].dep)
     {
-        uint32_t syncobj_handle = write_deps[lst_write_engine].dep->sync.handle;
+        uint32_t syncobj_handle = write_deps[lst_write_engine].dep->syncobj_handle;
         uint64_t bo_exec_timeline = write_deps[lst_write_engine].exec_timeline_index;
         if (max_timeline_data.count(syncobj_handle) == 0
                 || max_timeline_data[syncobj_handle] < bo_exec_timeline)