[VP] Enable euThreadSchedulingMode for SR
Enable euThreadScheduling mode for SR
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_softlet/agnostic/common/hw/mhw_render_cmdpar.h b/media_softlet/agnostic/common/hw/mhw_render_cmdpar.h
index 157454f..9ee5816 100644
--- a/media_softlet/agnostic/common/hw/mhw_render_cmdpar.h
+++ b/media_softlet/agnostic/common/hw/mhw_render_cmdpar.h
@@ -382,6 +382,7 @@
struct _MHW_PAR_T(STATE_COMPUTE_MODE)
{
bool enableLargeGrf = false;
+ uint32_t forceEuThreadSchedulingMode = 0;
};
} // namespace render
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..07b7845 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
@@ -150,6 +150,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 +201,8 @@
return MOS_STATUS_SUCCESS;
}
+ m_renderHal->euThreadSchedulingMode = 0;
+
VP_RENDER_CHK_STATUS_RETURN(m_kernelSet->CreateKernelObjects(
m_renderKernelParams,
m_surfSetting.surfGroup,
@@ -227,6 +248,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 +327,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
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..822e495 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);
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..1c41afc 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
@@ -114,6 +114,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();
@@ -141,6 +149,8 @@
VP_RENDER_CHK_STATUS_RETURN(SetWalkerSetting(kernelParams.kernelThreadSpace, kernelParams.syncFlag,kernelParams.flushL1));
+ VP_RENDER_CHK_STATUS_RETURN(SetTuningFlag(&kernelParams.kernelTuningParams));
+
return MOS_STATUS_SUCCESS;
}
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..8d946dd 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,11 @@
uint32_t iCapcityOfSurfaceEntry = 0;
} KERNEL_SURFACE_STATE_PARAM;
+typedef struct _KERNEL_TUNING_PARAMS
+{
+ uint32_t euThreadSchedulingMode;
+} KERNEL_TUNING_PARAMS, *PKERNEL_TUNING_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>;
@@ -89,6 +94,7 @@
KERNEL_THREAD_SPACE kernelThreadSpace;
bool syncFlag;
bool flushL1;
+ KERNEL_TUNING_PARAMS kernelTuningParams;
} KERNEL_PARAMS;
struct MEDIA_OBJECT_KA2_INLINE_DATA
@@ -503,6 +509,12 @@
virtual void OcaDumpKernelInfo(MOS_COMMAND_BUFFER &cmdBuffer, MOS_CONTEXT &mosContext);
+ virtual uint32_t GetEuThreadSchedulingMode()
+ {
+ // hw default mode
+ return 0;
+ }
+
protected:
virtual MOS_STATUS SetWalkerSetting(KERNEL_THREAD_SPACE &threadSpace, bool bSyncFlag, bool flushL1 = false);
@@ -525,6 +537,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
@@ -543,6 +557,8 @@
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.
std::shared_ptr<mhw::vebox::Itf> m_veboxItf = nullptr;