diff --git a/opencl/test/unit_test/os_interface/linux/drm_command_stream_tests_1.cpp b/opencl/test/unit_test/os_interface/linux/drm_command_stream_tests_1.cpp index dec9ae3857..56c6a9fb27 100644 --- a/opencl/test/unit_test/os_interface/linux/drm_command_stream_tests_1.cpp +++ b/opencl/test/unit_test/os_interface/linux/drm_command_stream_tests_1.cpp @@ -30,6 +30,7 @@ #include "shared/test/common/mocks/mock_gmm.h" #include "shared/test/common/mocks/mock_gmm_page_table_mngr.h" #include "shared/test/common/mocks/mock_host_ptr_manager.h" +#include "shared/test/common/mocks/mock_os_context.h" #include "shared/test/common/mocks/mock_submissions_aggregator.h" #include "shared/test/common/test_macros/test.h" @@ -725,6 +726,7 @@ struct DrmCommandStreamDirectSubmissionTest : public DrmCommandStreamEnhancedTes auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); auto engineType = device->getDefaultEngine().osContext->getEngineType(); hwInfo->capabilityTable.directSubmissionEngines.data[engineType].engineSupported = true; + static_cast(device->getDefaultEngine().osContext)->directSubmissionAvailableChecked = false; csr->initDirectSubmission(*device.get(), *device->getDefaultEngine().osContext); } diff --git a/shared/source/os_interface/os_context.cpp b/shared/source/os_interface/os_context.cpp index e3f696952a..33a0f2133c 100644 --- a/shared/source/os_interface/os_context.cpp +++ b/shared/source/os_interface/os_context.cpp @@ -66,7 +66,7 @@ bool OsContext::isDirectSubmissionAvailable(const HardwareInfo &hwInfo, bool &su enableDirectSubmission = DebugManager.flags.EnableDirectSubmission.get(); } - if (enableDirectSubmission) { + if (enableDirectSubmission && !directSubmissionAvailableChecked) { auto contextEngineType = this->getEngineType(); const DirectSubmissionProperties &directSubmissionProperty = hwInfo.capabilityTable.directSubmissionEngines.data[contextEngineType]; @@ -95,9 +95,10 @@ bool OsContext::isDirectSubmissionAvailable(const HardwareInfo &hwInfo, bool &su this->setDirectSubmissionActive(); } - return engineSupported && startDirect; + this->directSubmissionAvailableChecked = true; } - return false; + + return this->directSubmissionActive; } bool OsContext::checkDirectSubmissionSupportsEngine(const DirectSubmissionProperties &directSubmissionProperty, aub_stream::EngineType contextEngineType, bool &startOnInit, bool &startInContext) { diff --git a/shared/source/os_interface/os_context.h b/shared/source/os_interface/os_context.h index b5a4120e37..e5645e372a 100644 --- a/shared/source/os_interface/os_context.h +++ b/shared/source/os_interface/os_context.h @@ -67,6 +67,7 @@ class OsContext : public ReferenceTrackedObject { const bool rootDevice = false; bool defaultContext = false; bool directSubmissionActive = false; + bool directSubmissionAvailableChecked = false; std::once_flag contextInitializedFlag = {}; bool contextInitialized = false; bool engineInstancedDevice = false; diff --git a/shared/test/common/mocks/mock_os_context.h b/shared/test/common/mocks/mock_os_context.h index 1bd1fa5bec..9b2104f4b6 100644 --- a/shared/test/common/mocks/mock_os_context.h +++ b/shared/test/common/mocks/mock_os_context.h @@ -12,6 +12,8 @@ namespace NEO { class MockOsContext : public OsContext { public: using OsContext::checkDirectSubmissionSupportsEngine; + using OsContext::directSubmissionActive; + using OsContext::directSubmissionAvailableChecked; using OsContext::engineType; using OsContext::engineUsage; using OsContext::getDeviceBitfield; diff --git a/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp b/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp index fa6526cf7b..adb068d7c2 100644 --- a/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp +++ b/shared/test/unit_test/command_stream/command_stream_receiver_tests.cpp @@ -22,6 +22,7 @@ #include "shared/test/common/mocks/mock_csr.h" #include "shared/test/common/mocks/mock_execution_environment.h" #include "shared/test/common/mocks/mock_memory_manager.h" +#include "shared/test/common/mocks/mock_os_context.h" #include "shared/test/common/mocks/ult_device_factory.h" #include "shared/test/common/test_macros/matchers.h" #include "shared/test/common/test_macros/test.h" @@ -391,6 +392,7 @@ HWTEST_F(CommandStreamReceiverTest, givenUpdateTaskCountFromWaitWhenCheckTaskCou struct InitDirectSubmissionFixture { void SetUp() { DebugManager.flags.EnableDirectSubmission.set(1); + DebugManager.flags.EnableGemCloseWorker.set(0); executionEnvironment = new MockExecutionEnvironment(); DeviceFactory::prepareDeviceEnvironments(*executionEnvironment); VariableBackup backup(&ultHwConfig); @@ -423,6 +425,7 @@ HWTEST_F(InitDirectSubmissionTest, givenDirectSubmissionControllerEnabledWhenIni osContext->ensureContextInitialized(); osContext->setDefaultContext(true); + static_cast(osContext.get())->directSubmissionAvailableChecked = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; @@ -450,6 +453,7 @@ HWTEST_F(InitDirectSubmissionTest, givenDirectSubmissionControllerDisabledWhenIn osContext->ensureContextInitialized(); osContext->setDefaultContext(true); + static_cast(osContext.get())->directSubmissionAvailableChecked = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; @@ -469,6 +473,7 @@ HWTEST_F(InitDirectSubmissionTest, whenDirectSubmissionEnabledOnRcsThenExpectFea PreemptionMode::ThreadGroup, device->getDeviceBitfield()))); osContext->ensureContextInitialized(); osContext->setDefaultContext(true); + static_cast(osContext.get())->directSubmissionAvailableChecked = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; @@ -481,6 +486,26 @@ HWTEST_F(InitDirectSubmissionTest, whenDirectSubmissionEnabledOnRcsThenExpectFea csr.reset(); } +HWTEST_F(InitDirectSubmissionTest, givenCheckIfDirectSubmissionEnableWhenCallItMultipleTimesThenCheckDirectSubmissionEnablingConditionsOnce) { + std::unique_ptr osContext(OsContext::create(device->getExecutionEnvironment()->rootDeviceEnvironments[0]->osInterface.get(), 0, + EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_RCS, EngineUsage::Regular}, + PreemptionMode::ThreadGroup, device->getDeviceBitfield()))); + osContext->ensureContextInitialized(); + osContext->setDefaultContext(true); + static_cast(osContext.get())->directSubmissionAvailableChecked = false; + auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); + hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = true; + hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; + bool submitOnInit = false; + + auto ret = osContext->isDirectSubmissionAvailable(*hwInfo, submitOnInit); + EXPECT_TRUE(ret); + + static_cast(osContext.get())->directSubmissionActive = false; + ret = osContext->isDirectSubmissionAvailable(*hwInfo, submitOnInit); + EXPECT_FALSE(ret); +} + template class CommandStreamReceiverHwDirectSubmissionMock : public CommandStreamReceiverHw { public: @@ -501,6 +526,7 @@ HWTEST_F(InitDirectSubmissionTest, whenCallInitDirectSubmissionAgainThenItIsNotR PreemptionMode::ThreadGroup, device->getDeviceBitfield()))); osContext->ensureContextInitialized(); osContext->setDefaultContext(true); + static_cast(osContext.get())->directSubmissionAvailableChecked = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; @@ -527,6 +553,7 @@ HWTEST_F(InitDirectSubmissionTest, whenCallInitDirectSubmissionThenObtainLock) { PreemptionMode::ThreadGroup, device->getDeviceBitfield()))); osContext->ensureContextInitialized(); osContext->setDefaultContext(true); + static_cast(osContext.get())->directSubmissionAvailableChecked = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; @@ -542,6 +569,8 @@ HWTEST_F(InitDirectSubmissionTest, givenDirectSubmissionEnabledWhenPlatformNotSu PreemptionMode::ThreadGroup, device->getDeviceBitfield()))); osContext->ensureContextInitialized(); osContext->setDefaultContext(true); + static_cast(osContext.get())->directSubmissionAvailableChecked = false; + static_cast(osContext.get())->directSubmissionActive = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = false; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].submitOnInit = false; @@ -560,7 +589,7 @@ HWTEST_F(InitDirectSubmissionTest, whenDirectSubmissionEnabledOnBcsThenExpectFea PreemptionMode::ThreadGroup, device->getDeviceBitfield()))); osContext->ensureContextInitialized(); osContext->setDefaultContext(true); - + static_cast(osContext.get())->directSubmissionAvailableChecked = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_BCS].engineSupported = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_BCS].submitOnInit = false; @@ -580,7 +609,7 @@ HWTEST_F(InitDirectSubmissionTest, givenDirectSubmissionEnabledWhenPlatformNotSu PreemptionMode::ThreadGroup, device->getDeviceBitfield()))); osContext->ensureContextInitialized(); osContext->setDefaultContext(true); - + static_cast(osContext.get())->directSubmissionAvailableChecked = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_BCS].engineSupported = false; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_BCS].submitOnInit = false; @@ -600,7 +629,7 @@ HWTEST_F(InitDirectSubmissionTest, givenLowPriorityContextWhenDirectSubmissionDi PreemptionMode::ThreadGroup, device->getDeviceBitfield()))); osContext->ensureContextInitialized(); osContext->setDefaultContext(true); - + static_cast(osContext.get())->directSubmissionAvailableChecked = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].useLowPriority = false; @@ -619,7 +648,7 @@ HWTEST_F(InitDirectSubmissionTest, givenLowPriorityContextWhenDirectSubmissionEn EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_RCS, EngineUsage::LowPriority}, PreemptionMode::ThreadGroup, device->getDeviceBitfield()))); osContext->ensureContextInitialized(); - + static_cast(osContext.get())->directSubmissionAvailableChecked = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].useLowPriority = true; @@ -638,7 +667,7 @@ HWTEST_F(InitDirectSubmissionTest, givenInternalContextWhenDirectSubmissionDisab device->getDeviceBitfield()))); osContext->ensureContextInitialized(); osContext->setDefaultContext(true); - + static_cast(osContext.get())->directSubmissionAvailableChecked = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].useInternal = false; @@ -657,7 +686,7 @@ HWTEST_F(InitDirectSubmissionTest, givenInternalContextWhenDirectSubmissionEnabl EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_RCS, EngineUsage::Internal}, PreemptionMode::ThreadGroup, device->getDeviceBitfield()))); osContext->ensureContextInitialized(); - + static_cast(osContext.get())->directSubmissionAvailableChecked = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].useInternal = true; @@ -677,7 +706,7 @@ HWTEST_F(InitDirectSubmissionTest, givenRootDeviceContextWhenDirectSubmissionDis device->getDeviceBitfield(), true))); osContext->ensureContextInitialized(); osContext->setDefaultContext(true); - + static_cast(osContext.get())->directSubmissionAvailableChecked = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].useRootDevice = false; @@ -696,7 +725,7 @@ HWTEST_F(InitDirectSubmissionTest, givenRootDeviceContextWhenDirectSubmissionEna EngineDescriptorHelper::getDefaultDescriptor({aub_stream::ENGINE_RCS, EngineUsage::Internal}, PreemptionMode::ThreadGroup, device->getDeviceBitfield(), true))); osContext->ensureContextInitialized(); - + static_cast(osContext.get())->directSubmissionAvailableChecked = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].useRootDevice = true; @@ -716,7 +745,7 @@ HWTEST_F(InitDirectSubmissionTest, givenNonDefaultContextWhenDirectSubmissionDis device->getDeviceBitfield()))); osContext->ensureContextInitialized(); osContext->setDefaultContext(false); - + static_cast(osContext.get())->directSubmissionAvailableChecked = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].useNonDefault = false; @@ -736,7 +765,7 @@ HWTEST_F(InitDirectSubmissionTest, givenNonDefaultContextContextWhenDirectSubmis device->getDeviceBitfield()))); osContext->ensureContextInitialized(); osContext->setDefaultContext(false); - + static_cast(osContext.get())->directSubmissionAvailableChecked = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].engineSupported = true; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_RCS].useNonDefault = true; @@ -759,7 +788,7 @@ HWTEST_F(InitDirectSubmissionTest, GivenBlitterOverrideEnabledWhenBlitterIsNonDe device->getDeviceBitfield()))); osContext->ensureContextInitialized(); osContext->setDefaultContext(false); - + static_cast(osContext.get())->directSubmissionAvailableChecked = false; auto hwInfo = device->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_BCS].engineSupported = false; hwInfo->capabilityTable.directSubmissionEngines.data[aub_stream::ENGINE_BCS].useNonDefault = false;