[Encode] Fix R2R BRC media reset issue
1. Correct VerifySpaceAvailable and return MOS_STATUS_NO_SPACE if not success.
2. Remove unnecessary ReourceSync for rawSurface in 2nd pss.
3. Correct huc packet CalculateCommandBufferSize/CalculatePatchListSize;
4. Remove passNum calculation in CalculateCommandBufferSize/CalculatePatchListSize since packet is added for each pass.
diff --git a/media_driver/agnostic/common/hw/vdbox/mhw_vdbox.h b/media_driver/agnostic/common/hw/vdbox/mhw_vdbox.h
index 32dc565..03d56da 100644
--- a/media_driver/agnostic/common/hw/vdbox/mhw_vdbox.h
+++ b/media_driver/agnostic/common/hw/vdbox/mhw_vdbox.h
@@ -523,6 +523,14 @@
bool bShortFormat = false;
bool bHucDummyStream = false;
bool bSfcInUse = false;
+ uint32_t uNumStoreDataImm = 0;
+ uint32_t uNumStoreReg = 0;
+ uint32_t uNumMfxWait = 0;
+ uint32_t uNumAddConBBEnd = 0;
+ uint32_t uNumMiCopy = 0;
+ uint32_t uNumMiFlush = 0;
+ uint32_t bPerformHucStreamOut = false;
+ uint32_t uNumVdPipelineFlush = 0;
virtual ~MHW_VDBOX_STATE_CMDSIZE_PARAMS() {}
};
using PMHW_VDBOX_STATE_CMDSIZE_PARAMS = MHW_VDBOX_STATE_CMDSIZE_PARAMS * ;
diff --git a/media_driver/agnostic/common/hw/vdbox/mhw_vdbox_huc_generic.h b/media_driver/agnostic/common/hw/vdbox/mhw_vdbox_huc_generic.h
index 7c32958..14f27f1 100644
--- a/media_driver/agnostic/common/hw/vdbox/mhw_vdbox_huc_generic.h
+++ b/media_driver/agnostic/common/hw/vdbox/mhw_vdbox_huc_generic.h
@@ -49,6 +49,7 @@
MI_FLUSH_DW_CMD_NUMBER_OF_ADDRESSES = 1, // 2 DW for 1 address field
MI_CONDITIONAL_BATCH_BUFFER_END_CMD_NUMBER_OF_ADDRESSES = 1, // 2 DW for 1 address field
MI_STORE_REGISTER_MEM_CMD_NUMBER_OF_ADDRESSES = 1, // 2 DW for 1 address field
+ MI_COPY_MEM_MEM_CMD_NUMBER_OF_ADDRESSES = 2, // 4 DW for 2 address fields
VD_PIPELINE_FLUSH_CMD_NUMBER_OF_ADDRESSES = 0, // 0 DW for 0 address fields
@@ -94,6 +95,19 @@
uint32_t numStoreDataImm = 1;
uint32_t numStoreReg = 1;
+ MHW_MI_CHK_NULL(commandsSize);
+ MHW_MI_CHK_NULL(patchListSize);
+ MHW_MI_CHK_NULL(params);
+
+ if(params->uNumStoreDataImm)
+ {
+ numStoreDataImm = params->uNumStoreDataImm;
+ }
+ if(params->uNumStoreReg)
+ {
+ numStoreReg = params->uNumStoreReg;
+ }
+
if (mode == CODECHAL_DECODE_MODE_HEVCVLD && params->bShortFormat)
{
numSlices = CODECHAL_HEVC_MAX_NUM_SLICES_LVL_6;
@@ -154,6 +168,12 @@
numStoreDataImm * TMiCmds::MI_STORE_DATA_IMM_CMD::byteSize +
numStoreReg * TMiCmds::MI_STORE_REGISTER_MEM_CMD::byteSize;
+ if(params->uNumMfxWait)
+ {
+ maxSize +=
+ params->uNumMfxWait * TMiCmds::MFX_WAIT_CMD::byteSize;
+ }
+
patchListMaxSize +=
PATCH_LIST_COMMAND(HUC_PIPE_MODE_SELECT_CMD) +
PATCH_LIST_COMMAND(HUC_IMEM_STATE_CMD) +
@@ -165,27 +185,70 @@
numStoreDataImm * PATCH_LIST_COMMAND(MI_STORE_DATA_IMM_CMD) +
numStoreReg * PATCH_LIST_COMMAND(MI_STORE_REGISTER_MEM_CMD);
- if (params->bHucDummyStream)
+ if(params->uNumAddConBBEnd)
{
maxSize +=
- THucCmds::HUC_PIPE_MODE_SELECT_CMD::byteSize +
- THucCmds::HUC_IMEM_STATE_CMD::byteSize +
- THucCmds::HUC_DMEM_STATE_CMD::byteSize +
- THucCmds::HUC_VIRTUAL_ADDR_STATE_CMD::byteSize +
- THucCmds::HUC_IND_OBJ_BASE_ADDR_STATE_CMD::byteSize +
- THucCmds::HUC_STREAM_OBJECT_CMD::byteSize +
- THucCmds::HUC_START_CMD::byteSize +
- TMiCmds::MI_FLUSH_DW_CMD::byteSize;
+ params->uNumAddConBBEnd * TMiCmds::MI_CONDITIONAL_BATCH_BUFFER_END_CMD::byteSize;
patchListMaxSize +=
- PATCH_LIST_COMMAND(HUC_PIPE_MODE_SELECT_CMD) +
- PATCH_LIST_COMMAND(HUC_IMEM_STATE_CMD) +
- PATCH_LIST_COMMAND(HUC_DMEM_STATE_CMD) +
- PATCH_LIST_COMMAND(HUC_VIRTUAL_ADDR_STATE_CMD) +
- PATCH_LIST_COMMAND(HUC_IND_OBJ_BASE_ADDR_STATE_CMD) +
- PATCH_LIST_COMMAND(HUC_STREAM_OBJECT_CMD) +
- PATCH_LIST_COMMAND(HUC_START_CMD) +
- PATCH_LIST_COMMAND(MI_FLUSH_DW_CMD);
+ params->uNumAddConBBEnd * PATCH_LIST_COMMAND(MI_CONDITIONAL_BATCH_BUFFER_END_CMD);
+ }
+ if(params->uNumMiCopy)
+ {
+ maxSize +=
+ params->uNumMiCopy * TMiCmds::MI_COPY_MEM_MEM_CMD::byteSize;
+
+ patchListMaxSize +=
+ params->uNumMiCopy * PATCH_LIST_COMMAND(MI_COPY_MEM_MEM_CMD);
+ }
+ if(params->uNumMiFlush)
+ {
+ maxSize +=
+ params->uNumMiFlush * TMiCmds::MI_FLUSH_DW_CMD::byteSize;
+
+ patchListMaxSize +=
+ params->uNumMiFlush * PATCH_LIST_COMMAND(MI_FLUSH_DW_CMD);
+ }
+
+ if (params->bHucDummyStream || params->bPerformHucStreamOut)
+ {
+ uint32_t dummyTimes = params->bPerformHucStreamOut ? 2: 1;
+ for (uint32_t i = 0; i < dummyTimes; i++)
+ {
+ maxSize +=
+ THucCmds::HUC_PIPE_MODE_SELECT_CMD::byteSize +
+ THucCmds::HUC_IMEM_STATE_CMD::byteSize +
+ THucCmds::HUC_DMEM_STATE_CMD::byteSize +
+ THucCmds::HUC_VIRTUAL_ADDR_STATE_CMD::byteSize +
+ THucCmds::HUC_IND_OBJ_BASE_ADDR_STATE_CMD::byteSize +
+ THucCmds::HUC_STREAM_OBJECT_CMD::byteSize +
+ THucCmds::HUC_START_CMD::byteSize +
+ TMiCmds::MI_FLUSH_DW_CMD::byteSize;
+
+ patchListMaxSize +=
+ PATCH_LIST_COMMAND(HUC_PIPE_MODE_SELECT_CMD) +
+ PATCH_LIST_COMMAND(HUC_IMEM_STATE_CMD) +
+ PATCH_LIST_COMMAND(HUC_DMEM_STATE_CMD) +
+ PATCH_LIST_COMMAND(HUC_VIRTUAL_ADDR_STATE_CMD) +
+ PATCH_LIST_COMMAND(HUC_IND_OBJ_BASE_ADDR_STATE_CMD) +
+ PATCH_LIST_COMMAND(HUC_STREAM_OBJECT_CMD) +
+ PATCH_LIST_COMMAND(HUC_START_CMD) +
+ PATCH_LIST_COMMAND(MI_FLUSH_DW_CMD);
+ }
+ if (params->bPerformHucStreamOut)
+ {
+ maxSize +=
+ THucCmds::HUC_PIPE_MODE_SELECT_CMD::byteSize +
+ THucCmds::HUC_IND_OBJ_BASE_ADDR_STATE_CMD::byteSize +
+ THucCmds::HUC_STREAM_OBJECT_CMD::byteSize +
+ 4 * TMiCmds::MI_FLUSH_DW_CMD::byteSize;
+
+ patchListMaxSize +=
+ PATCH_LIST_COMMAND(HUC_PIPE_MODE_SELECT_CMD) +
+ PATCH_LIST_COMMAND(HUC_IND_OBJ_BASE_ADDR_STATE_CMD) +
+ PATCH_LIST_COMMAND(HUC_STREAM_OBJECT_CMD) +
+ 4 * PATCH_LIST_COMMAND(MI_FLUSH_DW_CMD);
+ }
}
*commandsSize = maxSize;
diff --git a/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_huc_g12_X.cpp b/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_huc_g12_X.cpp
index fcf2966..d26b320 100644
--- a/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_huc_g12_X.cpp
+++ b/media_driver/agnostic/gen12/hw/vdbox/mhw_vdbox_huc_g12_X.cpp
@@ -56,6 +56,12 @@
*commandsSize += mhw_vdbox_vdenc_g12_X::VD_PIPELINE_FLUSH_CMD::byteSize;
*patchListSize += PATCH_LIST_COMMAND(VD_PIPELINE_FLUSH_CMD);
+ if(params->uNumVdPipelineFlush)
+ {
+ *commandsSize += params->uNumVdPipelineFlush * mhw_vdbox_vdenc_g12_X::VD_PIPELINE_FLUSH_CMD::byteSize;
+ *patchListSize += params->uNumVdPipelineFlush * PATCH_LIST_COMMAND(VD_PIPELINE_FLUSH_CMD);
+ }
+
return MOS_STATUS_SUCCESS;
}
diff --git a/media_driver/media_driver_next/agnostic/common/shared/scalability/media_scalability.cpp b/media_driver/media_driver_next/agnostic/common/shared/scalability/media_scalability.cpp
index b91fccc..58c4de4 100644
--- a/media_driver/media_driver_next/agnostic/common/shared/scalability/media_scalability.cpp
+++ b/media_driver/media_driver_next/agnostic/common/shared/scalability/media_scalability.cpp
@@ -119,18 +119,43 @@
requestedSize,
0);
- if (statusPatchList == MOS_STATUS_SUCCESS && statusCmdBuf == MOS_STATUS_SUCCESS)
+ if (statusPatchList != MOS_STATUS_SUCCESS && statusCmdBuf != MOS_STATUS_SUCCESS)
+ {
+ SCALABILITY_CHK_STATUS_RETURN(ResizeCommandBufferAndPatchList(requestedSize + COMMAND_BUFFER_RESERVED_SPACE, requestedPatchListSize));
+ }
+ else if (statusPatchList != MOS_STATUS_SUCCESS)
+ {
+ SCALABILITY_CHK_STATUS_RETURN(ResizeCommandBufferAndPatchList(0, requestedPatchListSize));
+ }
+ else if (statusCmdBuf != MOS_STATUS_SUCCESS)
+ {
+ SCALABILITY_CHK_STATUS_RETURN(ResizeCommandBufferAndPatchList(requestedSize + COMMAND_BUFFER_RESERVED_SPACE, 0));
+ }
+ else
{
// This flag is just a hint for encode, decode/vpp don't use this flag.
singleTaskPhaseSupportedInPak = true;
return eStatus;
}
- requestedSize = requestedSize + COMMAND_BUFFER_RESERVED_SPACE;
-
- SCALABILITY_CHK_STATUS_RETURN(ResizeCommandBufferAndPatchList(requestedSize, requestedPatchListSize));
-
}
+
+ if (requestedPatchListSize)
+ {
+ statusPatchList = (MOS_STATUS)m_osInterface->pfnVerifyPatchListSize(
+ m_osInterface,
+ requestedPatchListSize);
+ }
+ statusCmdBuf = (MOS_STATUS)m_osInterface->pfnVerifyCommandBufferSize(
+ m_osInterface,
+ requestedSize,
+ 0);
+
+ if(statusPatchList != MOS_STATUS_SUCCESS || statusCmdBuf != MOS_STATUS_SUCCESS)
+ {
+ eStatus = MOS_STATUS_NO_SPACE;
+ }
+
return eStatus;
}