diff --git a/opencl/test/unit_test/helpers/test_preamble_xehp_plus.cpp b/opencl/test/unit_test/helpers/test_preamble_xehp_plus.cpp index d4bd3b76e7..af32e658db 100644 --- a/opencl/test/unit_test/helpers/test_preamble_xehp_plus.cpp +++ b/opencl/test/unit_test/helpers/test_preamble_xehp_plus.cpp @@ -579,3 +579,12 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, RenderSurfaceStateXeHPPlusTests, givenSpecificProdu EXPECT_EQ(FamilyType::RENDER_SURFACE_STATE::COHERENCY_TYPE_GPU_COHERENT, rssCmd.getCoherencyType()); } + +HWCMDTEST_F(IGFX_XE_HP_CORE, PreambleFixture, whenCallingIsSpecialPipelineSelectModeChangedThenReturnCorrectValue) { + using PIPELINE_SELECT = typename FamilyType::PIPELINE_SELECT; + bool oldPipelineSelectSpecialMode = true; + bool newPipelineSelectSpecialMode = false; + + auto result = PreambleHelper::isSpecialPipelineSelectModeChanged(oldPipelineSelectSpecialMode, newPipelineSelectSpecialMode, *defaultHwInfo); + EXPECT_TRUE(result); +} diff --git a/opencl/test/unit_test/libult/ult_command_stream_receiver.h b/opencl/test/unit_test/libult/ult_command_stream_receiver.h index 41e3745cc9..96ee96f2fc 100644 --- a/opencl/test/unit_test/libult/ult_command_stream_receiver.h +++ b/opencl/test/unit_test/libult/ult_command_stream_receiver.h @@ -84,6 +84,7 @@ class UltCommandStreamReceiver : public CommandStreamReceiverHw, publ using BaseClass::CommandStreamReceiver::lastSentL3Config; using BaseClass::CommandStreamReceiver::lastSentThreadArbitrationPolicy; using BaseClass::CommandStreamReceiver::lastSentUseGlobalAtomics; + using BaseClass::CommandStreamReceiver::lastSpecialPipelineSelectMode; using BaseClass::CommandStreamReceiver::lastVmeSubslicesConfig; using BaseClass::CommandStreamReceiver::latestFlushedTaskCount; using BaseClass::CommandStreamReceiver::latestSentStatelessMocsConfig; diff --git a/shared/source/command_container/command_encoder_xehp_plus.inl b/shared/source/command_container/command_encoder_xehp_plus.inl index 6291b37302..c745dae4e2 100644 --- a/shared/source/command_container/command_encoder_xehp_plus.inl +++ b/shared/source/command_container/command_encoder_xehp_plus.inl @@ -69,7 +69,7 @@ void EncodeDispatchKernel::encode(CommandContainer &container, if (kernelDescriptor.extendedInfo) { bool specialModeRequired = kernelDescriptor.extendedInfo->specialPipelineSelectModeRequired(); - if (container.lastPipelineSelectModeRequired != specialModeRequired) { + if (PreambleHelper::isSpecialPipelineSelectModeChanged(container.lastPipelineSelectModeRequired, specialModeRequired, hwInfo)) { container.lastPipelineSelectModeRequired = specialModeRequired; EncodeComputeMode::adjustPipelineSelect(container, kernelDescriptor); } @@ -539,18 +539,10 @@ template void EncodeComputeMode::adjustPipelineSelect(CommandContainer &container, const NEO::KernelDescriptor &kernelDescriptor) { using PIPELINE_SELECT = typename Family::PIPELINE_SELECT; auto pipelineSelectCmd = Family::cmdInitPipelineSelect; + auto isSpecialModeSelected = kernelDescriptor.extendedInfo && kernelDescriptor.extendedInfo->specialPipelineSelectModeRequired(); - if (kernelDescriptor.extendedInfo && kernelDescriptor.extendedInfo->specialPipelineSelectModeRequired()) { - pipelineSelectCmd.setSystolicModeEnable(true); - } else { - pipelineSelectCmd.setSystolicModeEnable(false); - } + PreambleHelper::appendProgramPipelineSelect(&pipelineSelectCmd, isSpecialModeSelected, container.getDevice()->getHardwareInfo()); - if (DebugManager.flags.OverrideSystolicPipelineSelect.get() != -1) { - pipelineSelectCmd.setSystolicModeEnable(DebugManager.flags.OverrideSystolicPipelineSelect.get()); - } - - pipelineSelectCmd.setMaskBits(pipelineSelectSystolicModeEnableMaskBits); pipelineSelectCmd.setPipelineSelection(PIPELINE_SELECT::PIPELINE_SELECTION_GPGPU); auto buffer = container.getCommandStream()->getSpace(sizeof(pipelineSelectCmd)); diff --git a/shared/source/command_stream/command_stream_receiver_hw_base.inl b/shared/source/command_stream/command_stream_receiver_hw_base.inl index 2c7b97f2e3..984a4e689a 100644 --- a/shared/source/command_stream/command_stream_receiver_hw_base.inl +++ b/shared/source/command_stream/command_stream_receiver_hw_base.inl @@ -258,12 +258,15 @@ CompletionStamp CommandStreamReceiverHw::flushTask( } auto newL3Config = PreambleHelper::getL3Config(peekHwInfo(), dispatchFlags.useSLM); + auto isSpecialPipelineSelectModeChanged = PreambleHelper::isSpecialPipelineSelectModeChanged(lastSpecialPipelineSelectMode, + dispatchFlags.pipelineSelectArgs.specialPipelineSelectMode, + peekHwInfo()); csrSizeRequestFlags.l3ConfigChanged = this->lastSentL3Config != newL3Config; csrSizeRequestFlags.coherencyRequestChanged = this->lastSentCoherencyRequest != static_cast(dispatchFlags.requiresCoherency); csrSizeRequestFlags.preemptionRequestChanged = this->lastPreemptionMode != dispatchFlags.preemptionMode; csrSizeRequestFlags.mediaSamplerConfigChanged = this->lastMediaSamplerConfig != static_cast(dispatchFlags.pipelineSelectArgs.mediaSamplerRequired); - csrSizeRequestFlags.specialPipelineSelectModeChanged = this->lastSpecialPipelineSelectMode != dispatchFlags.pipelineSelectArgs.specialPipelineSelectMode; + csrSizeRequestFlags.specialPipelineSelectModeChanged = isSpecialPipelineSelectModeChanged; if (dispatchFlags.numGrfRequired == GrfConfig::NotApplicable) { dispatchFlags.numGrfRequired = lastSentNumGrfRequired; diff --git a/shared/source/helpers/preamble.h b/shared/source/helpers/preamble.h index d75d12c3ab..a7df89ae8f 100644 --- a/shared/source/helpers/preamble.h +++ b/shared/source/helpers/preamble.h @@ -37,6 +37,7 @@ struct PreambleHelper { static void programPipelineSelect(LinearStream *pCommandStream, const PipelineSelectArgs &pipelineSelectArgs, const HardwareInfo &hwInfo); + static void appendProgramPipelineSelect(void *cmd, bool isSpecialModeSelected, const HardwareInfo &hwInfo); static void programThreadArbitration(LinearStream *pCommandStream, uint32_t requiredThreadArbitrationPolicy); static void programPreemption(LinearStream *pCommandStream, Device &device, GraphicsAllocation *preemptionCsr); static void addPipeControlBeforeVfeCmd(LinearStream *pCommandStream, const HardwareInfo *hwInfo, EngineGroupType engineGroupType); @@ -59,6 +60,9 @@ struct PreambleHelper { static void programSemaphoreDelay(LinearStream *pCommandStream); static uint32_t getL3Config(const HardwareInfo &hwInfo, bool useSLM); static bool isL3Configurable(const HardwareInfo &hwInfo); + static bool isSystolicModeConfigurable(const HardwareInfo &hwInfo); + static bool isSpecialPipelineSelectModeChanged(bool lastSpecialPipelineSelectMode, bool newSpecialPipelineSelectMode, + const HardwareInfo &hwInfo); static size_t getAdditionalCommandsSize(const Device &device); static size_t getThreadArbitrationCommandsSize(); static size_t getVFECommandsSize(); diff --git a/shared/source/helpers/preamble_bdw_plus.inl b/shared/source/helpers/preamble_bdw_plus.inl index c1c7cda28c..b5b592d9e5 100644 --- a/shared/source/helpers/preamble_bdw_plus.inl +++ b/shared/source/helpers/preamble_bdw_plus.inl @@ -77,4 +77,17 @@ size_t PreambleHelper::getVFECommandsSize() { return sizeof(MEDIA_VFE_STATE) + sizeof(PIPE_CONTROL); } +template +void PreambleHelper::appendProgramPipelineSelect(void *cmd, bool isSpecialModeSelected, const HardwareInfo &hwInfo) {} + +template +bool PreambleHelper::isSystolicModeConfigurable(const HardwareInfo &hwInfo) { + return false; +} + +template +bool PreambleHelper::isSpecialPipelineSelectModeChanged(bool lastSpecialPipelineSelectMode, bool newSpecialPipelineSelectMode, + const HardwareInfo &hwInfo) { + return false; +} } // namespace NEO diff --git a/shared/source/helpers/preamble_xehp_plus.inl b/shared/source/helpers/preamble_xehp_plus.inl index 39590e1a9a..170807f5c7 100644 --- a/shared/source/helpers/preamble_xehp_plus.inl +++ b/shared/source/helpers/preamble_xehp_plus.inl @@ -22,6 +22,12 @@ namespace NEO { +template <> +void PreambleHelper::appendProgramPipelineSelect(void *cmd, bool isSpecialModeSelected, const HardwareInfo &hwInfo); + +template <> +bool PreambleHelper::isSystolicModeConfigurable(const HardwareInfo &hwInfo); + template <> void PreambleHelper::programPipelineSelect(LinearStream *pCommandStream, const PipelineSelectArgs &pipelineSelectArgs, @@ -45,17 +51,13 @@ void PreambleHelper::programPipelineSelect(LinearStream *pCommandStream, auto pCmd = pCommandStream->getSpaceForCmd(); auto mask = pipelineSelectEnablePipelineSelectMaskBits | - pipelineSelectMediaSamplerDopClockGateMaskBits | - pipelineSelectSystolicModeEnableMaskBits; + pipelineSelectMediaSamplerDopClockGateMaskBits; cmd.setMaskBits(mask); cmd.setPipelineSelection(PIPELINE_SELECT::PIPELINE_SELECTION_GPGPU); cmd.setMediaSamplerDopClockGateEnable(!pipelineSelectArgs.mediaSamplerRequired); - cmd.setSystolicModeEnable(pipelineSelectArgs.specialPipelineSelectMode); - if (DebugManager.flags.OverrideSystolicPipelineSelect.get() != -1) { - cmd.setSystolicModeEnable(DebugManager.flags.OverrideSystolicPipelineSelect.get()); - } + appendProgramPipelineSelect(&cmd, pipelineSelectArgs.specialPipelineSelectMode, hwInfo); *pCmd = cmd; @@ -67,6 +69,25 @@ void PreambleHelper::programPipelineSelect(LinearStream *pCommandStream, } } +template <> +void PreambleHelper::appendProgramPipelineSelect(void *cmd, bool isSpecialModeSelected, const HardwareInfo &hwInfo) { + using PIPELINE_SELECT = typename Family::PIPELINE_SELECT; + auto command = static_cast(cmd); + auto mask = command->getMaskBits(); + + if (PreambleHelper::isSystolicModeConfigurable(hwInfo)) { + command->setSystolicModeEnable(isSpecialModeSelected); + mask |= pipelineSelectSystolicModeEnableMaskBits; + } + + if (DebugManager.flags.OverrideSystolicPipelineSelect.get() != -1) { + command->setSystolicModeEnable(DebugManager.flags.OverrideSystolicPipelineSelect.get()); + mask |= pipelineSelectSystolicModeEnableMaskBits; + } + + command->setMaskBits(mask); +} + template <> void PreambleHelper::addPipeControlBeforeVfeCmd(LinearStream *pCommandStream, const HardwareInfo *hwInfo, EngineGroupType engineGroupType) { } diff --git a/shared/source/xe_hp_core/preamble_xe_hp_core.cpp b/shared/source/xe_hp_core/preamble_xe_hp_core.cpp index 92a580db95..42f273469a 100644 --- a/shared/source/xe_hp_core/preamble_xe_hp_core.cpp +++ b/shared/source/xe_hp_core/preamble_xe_hp_core.cpp @@ -35,6 +35,17 @@ void PreambleHelper::appendProgramVFEState(const HardwareInfo &hwInfo, c } } +template <> +bool PreambleHelper::isSpecialPipelineSelectModeChanged(bool lastSpecialPipelineSelectMode, bool newSpecialPipelineSelectMode, + const HardwareInfo &hwInfo) { + return lastSpecialPipelineSelectMode != newSpecialPipelineSelectMode; +} + +template <> +bool PreambleHelper::isSystolicModeConfigurable(const HardwareInfo &hwInfo) { + return true; +} + template struct PreambleHelper; } // namespace NEO