[Encode] Enable ARB for TCBRC on ICL

Enable adaptive region boost for TCBRC on ICL.
diff --git a/media_driver/agnostic/common/codec/hal/codechal_huc_cmd_initializer.cpp b/media_driver/agnostic/common/codec/hal/codechal_huc_cmd_initializer.cpp
index d277a9c..4441f22 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_huc_cmd_initializer.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_huc_cmd_initializer.cpp
@@ -341,6 +341,7 @@
     bool                                        brcEnabled,
     bool                                        streaminEnabled,
     bool                                        roiStreamInEnabled,
+    bool                                        brcAdaptiveRegionBoostEnable,
     bool                                        roundingEnabled,
     bool                                        panicEnabled,
     int32_t                                     currentPass
@@ -378,6 +379,7 @@
     m_panicEnabled       = panicEnabled;
     m_roiStreamInEnabled = roiStreamInEnabled;
     m_currentPass        = currentPass;
+    m_brcAdaptiveRegionBoostEnabled = brcAdaptiveRegionBoostEnable;
 
     MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS));
     lockFlagsWriteOnly.WriteOnly = 1;
diff --git a/media_driver/agnostic/common/codec/hal/codechal_huc_cmd_initializer.h b/media_driver/agnostic/common/codec/hal/codechal_huc_cmd_initializer.h
index 8c8d46b..1c5533f 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_huc_cmd_initializer.h
+++ b/media_driver/agnostic/common/codec/hal/codechal_huc_cmd_initializer.h
@@ -216,6 +216,7 @@
     bool                                        m_roundingEnabled = false;
     bool                                        m_panicEnabled = false;
     bool                                        m_roiStreamInEnabled = false;
+    bool                                        m_brcAdaptiveRegionBoostEnabled = false;
     int32_t                                     m_currentPass = 0;
     int32_t                                     m_cmdCount = 0 ;
 
@@ -291,6 +292,7 @@
         bool                                        brcEnabled,
         bool                                        streaminEnabled,
         bool                                        roiStreamInEnabled,
+        bool                                        brcAdaptiveRegionBoostEnable,
         bool                                        roundingEnabled,
         bool                                        panicEnabled,
         int32_t                                     currentPass
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 e5de91a..5077c3f 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.cpp
@@ -2045,6 +2045,7 @@
         m_brcEnabled,
         m_vdencStreamInEnabled,
         m_vdencNativeROIEnabled,
+        m_brcAdaptiveRegionBoostEnable,
         m_hevcVdencRoundingEnabled,
         panicEnabled,
         currentPass));
@@ -2844,6 +2845,80 @@
     return eStatus;
 }
 
+MOS_STATUS CodechalVdencHevcState::SetupRegionBoosting(PMOS_RESOURCE vdencStreamIn, uint16_t boostIndex)
+{
+    MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
+
+    CODECHAL_ENCODE_FUNCTION_ENTER;
+    CODECHAL_ENCODE_CHK_NULL_RETURN(vdencStreamIn);
+
+    MOS_LOCK_PARAMS lockFlags;
+    MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
+    lockFlags.WriteOnly = 1;
+
+    uint8_t* data = (uint8_t*)m_osInterface->pfnLockResource(
+        m_osInterface,
+        vdencStreamIn,
+        &lockFlags);
+    CODECHAL_ENCODE_CHK_NULL_RETURN(data);
+
+    uint32_t streamInWidth = (MOS_ALIGN_CEIL(m_frameWidth, 64) / 32);
+    uint32_t streamInHeight = (MOS_ALIGN_CEIL(m_frameHeight, 64) / 32);
+    int32_t streamInNumCUs = streamInWidth * streamInHeight;
+
+    MOS_ZeroMemory(data, streamInNumCUs * 64);
+
+    MHW_VDBOX_VDENC_STREAMIN_STATE_PARAMS streaminDataParams;
+
+    MOS_ZeroMemory(&streaminDataParams, sizeof(streaminDataParams));
+    streaminDataParams.setQpRoiCtrl = true;
+    uint32_t roiCtrl = 85; // All four 16x16 blocks within the 32x32 blocks share the same region ID 1 (01010101).
+    for (uint16_t y = 0; y < streamInHeight; y++)
+    {
+        if ((y & 7) == boostIndex)
+        {
+            for (uint16_t x = 0; x < streamInWidth; x++)
+            {
+                streaminDataParams.roiCtrl = 85;
+                SetStreaminDataPerRegion(streamInWidth, y, y+1, x, x+1, &streaminDataParams, data);
+            }
+        }
+    }
+
+    MOS_ZeroMemory(&streaminDataParams, sizeof(streaminDataParams));
+    streaminDataParams.maxTuSize = 3;    //Maximum TU Size allowed, restriction to be set to 3
+    streaminDataParams.maxCuSize = 2;    //For ARB, currently support 32x32 block
+    switch (m_hevcSeqParams->TargetUsage)
+    {
+    case 1:
+    case 4:
+        streaminDataParams.numMergeCandidateCu64x64 = 4;
+        streaminDataParams.numMergeCandidateCu32x32 = 3;
+        streaminDataParams.numMergeCandidateCu16x16 = 2;
+        streaminDataParams.numMergeCandidateCu8x8   = 1;
+        streaminDataParams.numImePredictors         = m_imgStateImePredictors;
+        break;
+    case 7:
+        streaminDataParams.numMergeCandidateCu64x64 = 2;
+        streaminDataParams.numMergeCandidateCu32x32 = 2;
+        streaminDataParams.numMergeCandidateCu16x16 = 2;
+        streaminDataParams.numMergeCandidateCu8x8   = 0;
+        streaminDataParams.numImePredictors         = 4;
+        break;
+    }
+
+    for (auto i = 0; i < streamInNumCUs; i++)
+    {
+        SetStreaminDataPerLcu(&streaminDataParams, data + (i * 64));
+    }
+
+    m_osInterface->pfnUnlockResource(
+        m_osInterface,
+        vdencStreamIn);
+
+    return eStatus;
+}
+
 MOS_STATUS CodechalVdencHevcState::PrepareVDEncStreamInData()
 {
     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
@@ -2853,7 +2928,18 @@
     if (m_vdencStreamInEnabled && m_encodeParams.bMbQpDataEnabled)
         CODECHAL_ENCODE_CHK_STATUS_RETURN(SetupMbQpStreamIn(&m_resVdencStreamInBuffer[m_currRecycledBufIdx]));
 
-    if (m_vdencStreamInEnabled && m_hevcPicParams->NumROI)
+    if (m_brcAdaptiveRegionBoostSupported && m_hevcPicParams->TargetFrameSize && !m_lookaheadDepth)
+    {
+        // Adaptive region boost is enabled for TCBRC only
+        m_brcAdaptiveRegionBoostEnable = true;
+        m_vdencStreamInEnabled         = true;
+    }
+    else
+    {
+        m_brcAdaptiveRegionBoostEnable = false;
+    }
+
+    if (!m_brcAdaptiveRegionBoostEnable && m_vdencStreamInEnabled && m_hevcPicParams->NumROI)
     {
         ProcessRoiDeltaQp();
 
@@ -2868,10 +2954,18 @@
             CODECHAL_ENCODE_CHK_STATUS_RETURN(SetupROIStreamIn(&(m_resVdencStreamInBuffer[m_currRecycledBufIdx])));
         }
     }
-    else if (m_vdencStreamInEnabled && (m_hevcPicParams->NumDirtyRects > 0 && (B_TYPE == m_hevcPicParams->CodingType)))
+    else if (!m_brcAdaptiveRegionBoostEnable && m_vdencStreamInEnabled && (m_hevcPicParams->NumDirtyRects > 0 && (B_TYPE == m_hevcPicParams->CodingType)))
     {
         CODECHAL_ENCODE_CHK_STATUS_RETURN(SetupDirtyRectStreamIn(&(m_resVdencStreamInBuffer[m_currRecycledBufIdx])));
     }
+
+    if (m_brcAdaptiveRegionBoostEnable)
+    {
+        uint16_t rowOffset[8] = {0, 3, 5, 2, 7, 4, 1, 6};
+        uint16_t circularFrameIdx = (m_storeData - 1) & 7;
+        CODECHAL_ENCODE_CHK_STATUS_RETURN(SetupRegionBoosting(&(m_resVdencStreamInBuffer[m_currRecycledBufIdx]), rowOffset[circularFrameIdx]));
+    }
+
     return eStatus;
 }
 
diff --git a/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.h b/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.h
index 559c3a6..51a66de 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.h
+++ b/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.h
@@ -202,6 +202,8 @@
     bool                                    m_pakOnlyPass = false;                             //!< flag to signal VDEnc+PAK vs. PAK only
     bool                                    m_hevcVisualQualityImprovement = false;            //!< VQI enable flag
     bool                                    m_enableMotionAdaptive = false;                    //!< Motion adaptive enable flag
+    bool                                    m_brcAdaptiveRegionBoostSupported = false;         //!< ARB in BRC mode supported flag.
+    bool                                    m_brcAdaptiveRegionBoostEnable = false;            //!< ARB in BRC mode enable flag.
 
     //Resources for VDEnc
     MOS_RESOURCE                            m_sliceCountBuffer;                                //!< Slice count buffer
@@ -788,11 +790,21 @@
     //!
     //! \param    [in] streamIn
     //!           Pointer to streamin buffer
+    MOS_STATUS SetupForceIntraStreamIn(PMOS_RESOURCE streamIn);
+
+    //! \brief    Set VDENC StreamIn Surface for BRC Adaptive Region Boost
+    //!
+    //! \param    [in] vdencStreamIn
+    //!           StreamIn Surface Resource.
+    //! \param    [in] boostIndex
+    //!           Region index for boosting.
     //!
     //! \return   MOS_STATUS
     //!           MOS_STATUS_SUCCESS if success, else fail reason
     //!
-    MOS_STATUS SetupForceIntraStreamIn(PMOS_RESOURCE streamIn);
+    virtual MOS_STATUS SetupRegionBoosting(
+        PMOS_RESOURCE                vdencStreamIn,
+        uint16_t                     boostIndex);
 
     // Inherited virtual function
     MOS_STATUS Initialize(CodechalSetting * settings)  override;
diff --git a/media_driver/agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.cpp b/media_driver/agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.cpp
index 7f83f95..f358410 100644
--- a/media_driver/agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.cpp
+++ b/media_driver/agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.cpp
@@ -112,6 +112,12 @@
         }
     }
 
+    // For TCBRC adaptive region boost
+    if(m_brcAdaptiveRegionBoostEnabled)
+    {
+        cmd1.ROIStreamInEnabled = 1;
+    }
+
     // default
     cmd1.FwdPocNumForRefId0inL0 = 0x01;
     cmd1.FwdPocNumForRefId0inL1 = 0xff;
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 612790b..4806830 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
@@ -561,7 +561,7 @@
     PCODECHAL_VDENC_HEVC_STREAMIN_STATE_G10 data = (PCODECHAL_VDENC_HEVC_STREAMIN_STATE_G10)streaminData;
     if (streaminParams->setQpRoiCtrl)
     {
-        if (m_vdencNativeROIEnabled)
+        if (m_vdencNativeROIEnabled || m_brcAdaptiveRegionBoostEnable)
         {
             data->DW0.RoiCtrl = streaminParams->roiCtrl;
         }
@@ -1995,6 +1995,7 @@
             m_brcEnabled,
             m_vdencStreamInEnabled,
             m_vdencNativeROIEnabled,
+            m_brcAdaptiveRegionBoostEnable,
             m_hevcVdencRoundingEnabled,
             panicEnabled,
             GetCurrentPass()));
@@ -3480,7 +3481,6 @@
         hucVdencBrcInitDmem->StreamInROIEnable_U8 = 1;
         hucVdencBrcInitDmem->StreamInSurfaceEnable_U8 = 1;
     }
-
     // RDOQ adaptation hardened to HW starting Gen11
     hucVdencBrcInitDmem->RDOQ_AdaptationEnable_U8 = 0;
 
@@ -4764,6 +4764,7 @@
     m_kuidCommon = IDR_CODEC_HME_DS_SCOREBOARD_KERNEL;
     m_hucPakStitchEnabled = true;
     m_scalabilityState = nullptr;
+    m_brcAdaptiveRegionBoostSupported = true;
 
     MOS_ZeroMemory(&m_resPakcuLevelStreamoutData, sizeof(m_resPakcuLevelStreamoutData));
     MOS_ZeroMemory(&m_resPakSliceLevelStreamoutData, sizeof(m_resPakSliceLevelStreamoutData));