[VP] Enable HDR APO by default Open part

Switch default path to APO.
Defines chromasitting init only for HDR now.
Make other settings same as Legacy path.
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/bufferMgr/vp_resource_manager.cpp b/media_driver/media_driver_next/agnostic/common/vp/hal/bufferMgr/vp_resource_manager.cpp
index b0e0065..ef97487 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/bufferMgr/vp_resource_manager.cpp
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/bufferMgr/vp_resource_manager.cpp
@@ -605,15 +605,15 @@
     // Check IECP first here, since IECP is done after DI, and the vebox downsampling not affect the vebox input.
     if (executeCaps.bIECP)
     {
-        if (executeCaps.bHDR3DLUT)
-        {
-            return IS_COLOR_SPACE_BT2020(colorSpaceOutput) ? Format_R10G10B10A2 : Format_A8B8G8R8;
-        }
         // Upsampling to yuv444 for IECP input/output.
         // To align with legacy path, need to check whether inputFormat can also be used for IECP case,
         // in which case IECP down sampling will be applied.
         return Format_AYUV;
     }
+    else if (executeCaps.bHDR3DLUT)
+    {
+        return IS_COLOR_SPACE_BT2020(colorSpaceOutput) ? Format_R10G10B10A2 : Format_A8B8G8R8;
+    }
     else if (executeCaps.bDI)
     {
         // If the input is 4:2:0, then chroma data is doubled vertically to 4:2:2
@@ -1266,6 +1266,9 @@
     // Insert Vebox statistics surface
     surfGroup.insert(std::make_pair(SurfaceTypeStatistics, m_veboxStatisticsSurface));
 
+    // Insert Vebox 3Dlut surface
+    surfGroup.insert(std::make_pair(SurfaceType3dLut, m_vebox3DLookUpTables));
+
     // Update previous Dn output flag for next frame to use.
     if (surfGroup.find(SurfaceTypeDNOutput) != surfGroup.end() || m_sameSamples && m_pastDnOutputValid)
     {
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/policy.cpp b/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/policy.cpp
index 4b7eb80..415baf6 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/policy.cpp
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/policy.cpp
@@ -354,21 +354,24 @@
         VP_PUBLIC_CHK_STATUS_RETURN(MOS_STATUS_INVALID_PARAMETER);
     }
 
-    MOS_FORMAT   hdrFormat = Format_Any;
-    VPHAL_CSPACE hdrCSpace = CSpace_Any;
-
-    if (m_hwCaps.m_sfcHwEntry[cscParams->formatInput].inputSupported &&
+    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 (m_hwCaps.m_sfcHwEntry[hdrFormat].inputSupported &&
         m_hwCaps.m_sfcHwEntry[cscParams->formatOutput].outputSupported &&
-        m_hwCaps.m_sfcHwEntry[cscParams->formatInput].cscSupported)
+        m_hwCaps.m_sfcHwEntry[hdrFormat].cscSupported)
     {
-        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 (m_hwCaps.m_sfcHwEntry[hdrFormat].inputSupported &&
-            m_hwCaps.m_sfcHwEntry[cscParams->formatOutput].outputSupported &&
-            m_hwCaps.m_sfcHwEntry[hdrFormat].cscSupported)
+        cscEngine->bEnabled = 1;
+        cscEngine->VeboxNeeded  = 0;
+        cscEngine->RenderNeeded = 0;
+        if (hdrFormat != cscParams->formatOutput || hdrCSpace != cscParams->output.colorSpace)
         {
-            cscEngine->bEnabled = 1;
-            cscEngine->SfcNeeded |= 1;
+            cscEngine->SfcNeeded    |= 1;
+        }
+        else
+        {
+            cscEngine->SfcNeeded    = 0;
         }
     }
     else
@@ -918,7 +921,6 @@
     {
         pHDREngine->bEnabled        = 1;
         pHDREngine->VeboxNeeded     = 1;
-        pHDREngine->VeboxIECPNeeded = 1;
         if (hdrParams->formatOutput == Format_A8B8G8R8 || hdrParams->formatOutput == Format_A8R8G8B8)
         {
             pHDREngine->VeboxARGBOut = 1;
@@ -1096,6 +1098,10 @@
             }
         }
     }
+    else
+    {
+        VP_PUBLIC_CHK_STATUS_RETURN(FilterFeatureCombination(inputPipe));
+    }
 
     engineCaps.value = 0;
     // Set Engine Caps the first time
@@ -1116,6 +1122,39 @@
     return MOS_STATUS_SUCCESS;
 }
 
+MOS_STATUS Policy::FilterFeatureCombination(SwFilterSubPipe *pipe)
+{
+    VP_FUNC_CALL();
+
+    auto hdr = pipe->GetSwFilter(FeatureTypeHdr);
+    if (nullptr != hdr)
+    {
+        for (auto filterID : m_featurePool)
+        {
+            if (filterID == FeatureTypeTcc ||
+                filterID == FeatureTypeSte ||
+                filterID == FeatureTypeProcamp)
+            {
+                auto feature = pipe->GetSwFilter(FeatureType(filterID));
+                if (feature && feature->GetFilterEngineCaps().bEnabled)
+                {
+                    feature->GetFilterEngineCaps().bEnabled = false;
+                }
+            }
+            if (filterID == FeatureTypeCsc)
+            {
+                SwFilterCsc *feature = (SwFilterCsc *)pipe->GetSwFilter(FeatureType(filterID));
+                if (feature)
+                {
+                    auto &params      = feature->GetSwFilterParams();
+                    params.pIEFParams = nullptr;
+                }
+            }
+        }
+    }
+    return MOS_STATUS_SUCCESS;
+}
+
 MOS_STATUS Policy::BuildExecuteFilter(SwFilterPipe& featurePipe, VP_EXECUTE_CAPS& caps, HW_FILTER_PARAMS& params)
 {
     VP_FUNC_CALL();
@@ -1247,7 +1286,7 @@
                 }
                 // Vebox only cases
                 else if (caps.bVebox && engineCaps->bEnabled &&
-                    (engineCaps->VeboxNeeded || (caps.bIECP && filterID == FeatureTypeCsc)))
+                    (engineCaps->VeboxNeeded || (!caps.bHDR3DLUT && caps.bIECP && filterID == FeatureTypeCsc)))
                 {
                     UpdateExeCaps(feature, caps, EngineTypeVebox);
                 }
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/policy.h b/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/policy.h
index 9dc37d4..0b90067 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/policy.h
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/policy.h
@@ -113,6 +113,8 @@
 
     MOS_STATUS AssignExecuteResource(VP_EXECUTE_CAPS& caps, HW_FILTER_PARAMS& params);
 
+    virtual MOS_STATUS FilterFeatureCombination(SwFilterSubPipe *pipe);
+
     virtual bool IsVeboxSecurePathEnabled(SwFilterPipe& subSwFilterPipe, VP_EXECUTE_CAPS& caps)
     {
         return false;
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_csc_filter.cpp b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_csc_filter.cpp
index 6ef0e50..d5dc532 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_csc_filter.cpp
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_csc_filter.cpp
@@ -202,8 +202,8 @@
         m_sfcCSCParams->iefParams = m_cscParams.pIEFParams;
     }
 
-    m_cscParams.input.colorSpace    = GetSfcInputColorSpace(m_executeCaps, m_cscParams.input.colorSpace, m_cscParams.output.colorSpace);
-    m_sfcCSCParams->inputColorSpace = m_cscParams.input.colorSpace;
+    m_cscParams.input.colorSpace    = m_cscParams.input.colorSpace;
+    m_sfcCSCParams->inputColorSpace = GetSfcInputColorSpace(m_executeCaps, m_cscParams.input.colorSpace, m_cscParams.output.colorSpace);
 
     m_cscParams.formatInput         = GetSfcInputFormat(m_executeCaps, m_cscParams.formatInput, m_cscParams.output.colorSpace);
     m_sfcCSCParams->inputFormat     = m_cscParams.formatInput;
@@ -322,7 +322,7 @@
     VP_RENDER_CHK_NULL_RETURN(m_veboxCSCParams);
 
     VPHAL_COLORPACK       srcColorPack;
-    bool bNeedUpSampling = vpExecuteCaps.bIECP;
+    bool bNeedUpSampling = vpExecuteCaps.bIECP || vpExecuteCaps.bHDR3DLUT;
     bool bDIEnabled      = vpExecuteCaps.bDI;
 
     srcColorPack = VpHal_GetSurfaceColorPack(m_cscParams.formatInput);
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.cpp b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.cpp
index d796532..01973de 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.cpp
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.cpp
@@ -113,6 +113,7 @@
     MOS_FORMAT format,
     bool bOutput,
     bool bRotateNeeded,
+    bool bVEHDR3DlutUsed,
     uint16_t & widthAlignUnit,
     uint16_t & heightAlignUnit)
 {
@@ -136,6 +137,11 @@
         // Output rect has been rotated in SwFilterScaling::Configure. Need to swap the alignUnit accordingly.
         swap(widthAlignUnit, heightAlignUnit);
     }
+    if (m_pvpMhwInterface && MEDIA_IS_SKU(m_pvpMhwInterface->m_skuTable, FtrHeight8AlignVE3DLUTDualPipe)
+        && bVEHDR3DlutUsed)
+    {
+        heightAlignUnit = 8;
+    }
 }
 
 MOS_STATUS VpScalingFilter::IsColorfillEnable()
@@ -274,8 +280,8 @@
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
 
     GetFormatWidthHeightAlignUnit(isOutputSurf ? m_scalingParams.formatOutput : m_scalingParams.formatInput,
-        isOutputSurf, m_scalingParams.rotation.rotationNeeded, wWidthAlignUnit, wHeightAlignUnit);
-    GetFormatWidthHeightAlignUnit(m_scalingParams.formatOutput, true, m_scalingParams.rotation.rotationNeeded, wWidthAlignUnitForDstRect, wHeightAlignUnitForDstRect);
+        isOutputSurf, m_scalingParams.rotation.rotationNeeded, false, wWidthAlignUnit, wHeightAlignUnit);
+    GetFormatWidthHeightAlignUnit(m_scalingParams.formatOutput, true, false, m_scalingParams.rotation.rotationNeeded, wWidthAlignUnitForDstRect, wHeightAlignUnitForDstRect);
 
     // The source rectangle is floored to the aligned unit to
     // get rid of invalid data(ex: an odd numbered src rectangle with NV12 format
@@ -393,6 +399,7 @@
         GetFormatWidthHeightAlignUnit(
             m_scalingParams.formatOutput,
             true,
+            false,
             m_scalingParams.rotation.rotationNeeded,
             wOutputWidthAlignUnit,
             wOutputHeightAlignUnit);
@@ -401,6 +408,7 @@
         GetFormatWidthHeightAlignUnit(
             m_sfcScalingParams->inputFrameFormat,
             false,
+            m_executeCaps.bHDR3DLUT,
             m_scalingParams.rotation.rotationNeeded,
             wInputWidthAlignUnit,
             wInputHeightAlignUnit);
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.h b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.h
index 7a2940f..bea0109 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.h
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.h
@@ -96,6 +96,7 @@
         MOS_FORMAT              format,
         bool                    bOutput,
         bool                    bRotateNeeded,
+        bool                    bVE3DlutUsed,
         uint16_t                &widthAlignUnit,
         uint16_t                &heightAlignUnit);
 
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/packet/vp_vebox_common.h b/media_driver/media_driver_next/agnostic/common/vp/hal/packet/vp_vebox_common.h
index ec0d339..2afd581 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/packet/vp_vebox_common.h
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/packet/vp_vebox_common.h
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2018-2020, Intel Corporation
+* Copyright (c) 2018-2021, Intel Corporation
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
@@ -413,6 +413,17 @@
 
     uint32_t *pAceCacheData  = nullptr;
 
+    virtual MOS_STATUS InitChromaSampling()
+    {
+        MOS_ZeroMemory(&m_chromaSampling, sizeof(MHW_VEBOX_CHROMA_SAMPLING));
+        m_chromaSampling.BypassChromaUpsampling                     = 1;
+        m_chromaSampling.ChromaUpsamplingCoSitedHorizontalOffset    = 0;
+        m_chromaSampling.ChromaUpsamplingCoSitedVerticalOffset      = 0;
+        m_chromaSampling.BypassChromaDownsampling                   = 1;
+        m_chromaSampling.ChromaDownsamplingCoSitedHorizontalOffset  = 0;
+        m_chromaSampling.ChromaDownsamplingCoSitedVerticalOffset    = 0;
+        return MOS_STATUS_SUCCESS;
+    }
 protected:
     MHW_VEBOX_DNDI_PARAMS   m_veboxDNDIParams = {};
     MHW_VEBOX_IECP_PARAMS   m_veboxIecpParams = {};