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 ¶ms) @@ -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 ¶ms2ndPass = filter2ndPass->GetSwFilterParams(); - FeatureParamDeinterlace ¶ms1stPass = 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 ¶m) +{ + 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 ¶m, 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 ¶m) +{ + VP_FUNC_CALL(); + + m_Params = param; + return MOS_STATUS_SUCCESS; +} + + +/****************************************************************************************************/ +/* Packet L0 Fc Parameter */ +/****************************************************************************************************/ +VpPacketParameter *VpRenderL0FcParameter::Create(HW_FILTER_L0_FC_PARAM ¶m) +{ + 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 ¶ms) +{ + 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 ¶m = 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 ¶m); + + 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 ¶m, FeatureType featureType); + HwFilterL0FcParameter(FeatureType featureType); + virtual ~HwFilterL0FcParameter(); + virtual MOS_STATUS ConfigParams(HwFilter &hwFilter); + + MOS_STATUS Initialize(HW_FILTER_L0_FC_PARAM ¶m); + +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 ¶m); + VpRenderL0FcParameter(PVP_MHWINTERFACE pHwInterface, PacketParamFactoryBase *packetParamFactory); + virtual ~VpRenderL0FcParameter(); + + virtual bool SetPacketParam(VpCmdPacket *pPacket); + +private: + MOS_STATUS Initialize(HW_FILTER_L0_FC_PARAM ¶ms); + + 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 ¶m) + { + 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 ¶m) + { + if (param.type != FeatureTypeFcOnRender) + { + VP_PUBLIC_ASSERTMESSAGE("Invalid parameter for FC!"); + return nullptr; + } + + HW_FILTER_L0_FC_PARAM *fcParam = (HW_FILTER_L0_FC_PARAM *)(¶m); + 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 ¶m) @@ -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)