From 4fce3ede9b4a0dd6c5bf5581e037e61315717bba Mon Sep 17 00:00:00 2001 From: "Spruit, Neil R" Date: Thu, 8 Dec 2022 00:05:54 +0000 Subject: [PATCH] Enable NodeMask Generation thru L0 LUID Extension Related-To: LOCI-3250 Signed-off-by: Spruit, Neil R --- level_zero/core/source/device/device_imp.cpp | 2 +- level_zero/core/source/device/device_imp.h | 1 + .../source/device/device_imp_drm/device_imp.cpp | 3 +++ .../device/device_imp_drm_or_wddm/device_imp.cpp | 12 ++++++++++++ .../source/device/device_imp_wddm/device_imp.cpp | 6 ++++++ .../device/device_drm_or_wddm/test_device.cpp | 14 ++++++++++++-- .../sources/device/device_wddm/test_device.cpp | 4 ++-- .../os_interface/windows/wddm20_tests.cpp | 8 ++++---- .../windows/wddm_kmdaf_listener_tests.cpp | 2 +- .../windows/wddm_memory_manager_tests.cpp | 1 + shared/source/os_interface/windows/hw_device_id.h | 6 +++++- .../os_interface/windows/hw_device_id_win.cpp | 4 ++-- .../source/os_interface/windows/os_context_win.cpp | 6 ++++++ .../source/os_interface/windows/os_context_win.h | 1 + shared/source/os_interface/windows/wddm/wddm.cpp | 8 ++++---- ...mory_allocator_multi_device_fixture_windows.cpp | 2 +- shared/test/common/mocks/mock_wddm.cpp | 2 +- ...igure_device_address_space_drm_or_wddm_test.cpp | 4 ++-- .../windows/wddm_adapter_luid_tests.cpp | 10 ++++++++-- .../unit_test/os_interface/windows/wddm_tests.cpp | 4 ++-- 20 files changed, 75 insertions(+), 25 deletions(-) diff --git a/level_zero/core/source/device/device_imp.cpp b/level_zero/core/source/device/device_imp.cpp index a3bc3bf42d..a188985f06 100644 --- a/level_zero/core/source/device/device_imp.cpp +++ b/level_zero/core/source/device/device_imp.cpp @@ -821,11 +821,11 @@ ze_result_t DeviceImp::getProperties(ze_device_properties_t *pDeviceProperties) if (extendedProperties->stype == ZE_STRUCTURE_TYPE_DEVICE_LUID_EXT_PROPERTIES) { ze_device_luid_ext_properties_t *deviceLuidProperties = reinterpret_cast(extendedProperties); + deviceLuidProperties->nodeMask = queryDeviceNodeMask(); ze_result_t result = queryDeviceLuid(deviceLuidProperties); if (result != ZE_RESULT_SUCCESS) { return result; } - deviceLuidProperties->nodeMask = 1; } } } diff --git a/level_zero/core/source/device/device_imp.h b/level_zero/core/source/device/device_imp.h index a28510b64c..2925ec7013 100644 --- a/level_zero/core/source/device/device_imp.h +++ b/level_zero/core/source/device/device_imp.h @@ -144,6 +144,7 @@ struct DeviceImp : public Device { ze_result_t queryDeviceLuid(ze_device_luid_ext_properties_t *deviceLuidProperties); ze_result_t setDeviceLuid(ze_device_luid_ext_properties_t *deviceLuidProperties); uint32_t getEventMaxPacketCount() const override; + uint32_t queryDeviceNodeMask(); protected: void adjustCommandQueueDesc(uint32_t &ordinal, uint32_t &index); diff --git a/level_zero/core/source/device/device_imp_drm/device_imp.cpp b/level_zero/core/source/device/device_imp_drm/device_imp.cpp index b0d5b4f3b0..0be94bc93e 100644 --- a/level_zero/core/source/device/device_imp_drm/device_imp.cpp +++ b/level_zero/core/source/device/device_imp_drm/device_imp.cpp @@ -12,5 +12,8 @@ namespace L0 { ze_result_t DeviceImp::queryDeviceLuid(ze_device_luid_ext_properties_t *deviceLuidProperties) { return ZE_RESULT_ERROR_UNSUPPORTED_FEATURE; } +uint32_t DeviceImp::queryDeviceNodeMask() { + return 1; +} } // namespace L0 \ No newline at end of file diff --git a/level_zero/core/source/device/device_imp_drm_or_wddm/device_imp.cpp b/level_zero/core/source/device/device_imp_drm_or_wddm/device_imp.cpp index 09829931b3..8c9ed38492 100644 --- a/level_zero/core/source/device/device_imp_drm_or_wddm/device_imp.cpp +++ b/level_zero/core/source/device/device_imp_drm_or_wddm/device_imp.cpp @@ -32,5 +32,17 @@ ze_result_t DeviceImp::queryDeviceLuid(ze_device_luid_ext_properties_t *deviceLu } return ZE_RESULT_ERROR_UNINITIALIZED; } +uint32_t DeviceImp::queryDeviceNodeMask() { + NEO::Device *activeDevice = getActiveDevice(); + if (activeDevice->getRootDeviceEnvironment().osInterface) { + NEO::DriverModelType driverType = neoDevice->getRootDeviceEnvironment().osInterface->getDriverModel()->getDriverModelType(); + if (driverType == NEO::DriverModelType::WDDM) { + NEO::CommandStreamReceiver *csr = activeDevice->getDefaultEngine().commandStreamReceiver; + NEO::OsContextWin *context = static_cast(&csr->getOsContext()); + return context->getDeviceNodeMask(); + } + } + return 1; +} } // namespace L0 \ No newline at end of file diff --git a/level_zero/core/source/device/device_imp_wddm/device_imp.cpp b/level_zero/core/source/device/device_imp_wddm/device_imp.cpp index c0366681b7..dd2dba888a 100644 --- a/level_zero/core/source/device/device_imp_wddm/device_imp.cpp +++ b/level_zero/core/source/device/device_imp_wddm/device_imp.cpp @@ -24,5 +24,11 @@ ze_result_t DeviceImp::queryDeviceLuid(ze_device_luid_ext_properties_t *deviceLu std::copy_n(luidData.begin(), ZE_MAX_DEVICE_LUID_SIZE_EXT, std::begin(deviceLuidProperties->luid.id)); return ZE_RESULT_SUCCESS; } +uint32_t DeviceImp::queryDeviceNodeMask() { + NEO::Device *activeDevice = getActiveDevice(); + NEO::CommandStreamReceiver *csr = activeDevice->getDefaultEngine().commandStreamReceiver; + NEO::OsContextWin *context = static_cast(&csr->getOsContext()); + return context->getDeviceNodeMask(); +} } // namespace L0 \ No newline at end of file diff --git a/level_zero/core/test/unit_tests/sources/device/device_drm_or_wddm/test_device.cpp b/level_zero/core/test/unit_tests/sources/device/device_drm_or_wddm/test_device.cpp index 610fa5bdc0..8e5f4ba896 100644 --- a/level_zero/core/test/unit_tests/sources/device/device_drm_or_wddm/test_device.cpp +++ b/level_zero/core/test/unit_tests/sources/device/device_drm_or_wddm/test_device.cpp @@ -37,7 +37,7 @@ struct CloseAdapterMock { struct MockHwDeviceIdWddm : public HwDeviceIdWddm { using HwDeviceIdWddm::osEnvironment; - MockHwDeviceIdWddm(D3DKMT_HANDLE adapterIn, LUID adapterLuidIn, OsEnvironment *osEnvironmentIn, std::unique_ptr umKmDataTranslator) : HwDeviceIdWddm(adapterIn, adapterLuidIn, osEnvironmentIn, std::move(umKmDataTranslator)) {} + MockHwDeviceIdWddm(D3DKMT_HANDLE adapterIn, LUID adapterLuidIn, uint32_t adapterNodeOrdinalIn, OsEnvironment *osEnvironmentIn, std::unique_ptr umKmDataTranslator) : HwDeviceIdWddm(adapterIn, adapterLuidIn, adapterNodeOrdinalIn, osEnvironmentIn, std::move(umKmDataTranslator)) {} }; class MockDriverModelWDDMLUID : public NEO::Wddm { @@ -56,7 +56,7 @@ class MockDriverModelWDDMLUID : public NEO::Wddm { return true; } - MockDriverModelWDDMLUID(RootDeviceEnvironment &rootDeviceEnvironment) : Wddm(std::make_unique(ADAPTER_HANDLE_WDDM_FAKE, LUID{0x12, 0x1234}, rootDeviceEnvironment.executionEnvironment.osEnvironment.get(), std::make_unique()), rootDeviceEnvironment) { + MockDriverModelWDDMLUID(RootDeviceEnvironment &rootDeviceEnvironment) : Wddm(std::make_unique(ADAPTER_HANDLE_WDDM_FAKE, LUID{0x12, 0x1234}, 1u, rootDeviceEnvironment.executionEnvironment.osEnvironment.get(), std::make_unique()), rootDeviceEnvironment) { if (!rootDeviceEnvironment.executionEnvironment.osEnvironment.get()) { rootDeviceEnvironment.executionEnvironment.osEnvironment = std::make_unique(); } @@ -74,6 +74,16 @@ class MockOsContextWin : public OsContextWin { using LuidDeviceTest = Test; +TEST_F(LuidDeviceTest, givenOsContextWinAndGetDeviceNodeMaskThenNodeMaskIsAtLeast1) { + DebugManager.flags.EnableL0ReadLUIDExtension.set(true); + auto luidMock = new MockDriverModelWDDMLUID(*neoDevice->executionEnvironment->rootDeviceEnvironments[0]); + auto defaultEngine = defaultHwInfo->capabilityTable.defaultEngineType; + OsContextWin osContext(*luidMock, 0, 0u, EngineDescriptorHelper::getDefaultDescriptor({defaultEngine, EngineUsage::Regular})); + EXPECT_GE(osContext.getDeviceNodeMask(), 1u); + delete luidMock; + DebugManager.flags.EnableL0ReadLUIDExtension.set(false); +} + TEST_F(LuidDeviceTest, givenOsContextWinAndGetLUIDArrayThenLUIDisValid) { DebugManager.flags.EnableL0ReadLUIDExtension.set(true); auto luidMock = new MockDriverModelWDDMLUID(*neoDevice->executionEnvironment->rootDeviceEnvironments[0]); diff --git a/level_zero/core/test/unit_tests/sources/device/device_wddm/test_device.cpp b/level_zero/core/test/unit_tests/sources/device/device_wddm/test_device.cpp index a3b20b4017..77c404485a 100644 --- a/level_zero/core/test/unit_tests/sources/device/device_wddm/test_device.cpp +++ b/level_zero/core/test/unit_tests/sources/device/device_wddm/test_device.cpp @@ -54,7 +54,7 @@ #include "gtest/gtest.h" namespace NEO { -std::unique_ptr createHwDeviceIdFromAdapterLuid(OsEnvironmentWin &osEnvironment, LUID adapterLuid); +std::unique_ptr createHwDeviceIdFromAdapterLuid(OsEnvironmentWin &osEnvironment, LUID adapterLuid, uint32_t adapterNodeOrdinal); } // namespace NEO namespace L0 { @@ -86,7 +86,7 @@ TEST_F(LuidDeviceTest, givenLuidDevicePropertiesStructureThenLuidAndNodeMaskSetF auto osInterface = new OSInterface(); luidMock = new WddmMock(*executionEnvironment->rootDeviceEnvironments[0]); LUID adapterLuid = {0x12, 0x1234}; - luidMock->hwDeviceId = NEO::createHwDeviceIdFromAdapterLuid(*osEnvironment, adapterLuid); + luidMock->hwDeviceId = NEO::createHwDeviceIdFromAdapterLuid(*osEnvironment, adapterLuid, 1u); executionEnvironment->rootDeviceEnvironments[0]->osInterface.reset(osInterface); executionEnvironment->rootDeviceEnvironments[0]->osInterface->setDriverModel(std::unique_ptr(luidMock)); luidMock->init(); diff --git a/opencl/test/unit_test/os_interface/windows/wddm20_tests.cpp b/opencl/test/unit_test/os_interface/windows/wddm20_tests.cpp index 5d154b2692..96a9132ca2 100644 --- a/opencl/test/unit_test/os_interface/windows/wddm20_tests.cpp +++ b/opencl/test/unit_test/os_interface/windows/wddm20_tests.cpp @@ -29,7 +29,7 @@ namespace SysCalls { extern const wchar_t *currentLibraryPath; } extern uint32_t numRootDevicesToEnum; -std::unique_ptr createHwDeviceIdFromAdapterLuid(OsEnvironmentWin &osEnvironment, LUID adapterLuid); +std::unique_ptr createHwDeviceIdFromAdapterLuid(OsEnvironmentWin &osEnvironment, LUID adapterLuid, uint32_t adapterNodeOrdinalIn); } // namespace NEO using namespace NEO; @@ -1490,7 +1490,7 @@ TEST(HwDeviceId, whenHwDeviceIdIsDestroyedThenAdapterIsClosed) { D3DKMT_HANDLE adapter = 0x1234; { - HwDeviceIdWddm hwDeviceId{adapter, {}, osEnv.get(), std::make_unique()}; + HwDeviceIdWddm hwDeviceId{adapter, {}, 1u, osEnv.get(), std::make_unique()}; } EXPECT_EQ(1u, GdiWithMockedCloseFunc::closeAdapterCalled); EXPECT_EQ(adapter, GdiWithMockedCloseFunc::closeAdapterCalledArgPassed); @@ -1706,7 +1706,7 @@ TEST(VerifyAdapterType, whenAdapterDoesntSupportRenderThenDontCreateHwDeviceId) osEnv->gdi.reset(gdi.release()); LUID shadowAdapterLuid = {0xdd, 0xdd}; - auto hwDeviceId = createHwDeviceIdFromAdapterLuid(*osEnv, shadowAdapterLuid); + auto hwDeviceId = createHwDeviceIdFromAdapterLuid(*osEnv, shadowAdapterLuid, 1u); EXPECT_EQ(nullptr, hwDeviceId.get()); } @@ -1716,7 +1716,7 @@ TEST(VerifyAdapterType, whenAdapterSupportsRenderThenCreateHwDeviceId) { osEnv->gdi.reset(gdi.release()); LUID adapterLuid = {0x12, 0x1234}; - auto hwDeviceId = createHwDeviceIdFromAdapterLuid(*osEnv, adapterLuid); + auto hwDeviceId = createHwDeviceIdFromAdapterLuid(*osEnv, adapterLuid, 1u); EXPECT_NE(nullptr, hwDeviceId.get()); } diff --git a/opencl/test/unit_test/os_interface/windows/wddm_kmdaf_listener_tests.cpp b/opencl/test/unit_test/os_interface/windows/wddm_kmdaf_listener_tests.cpp index af90e2fdf9..814259157e 100644 --- a/opencl/test/unit_test/os_interface/windows/wddm_kmdaf_listener_tests.cpp +++ b/opencl/test/unit_test/os_interface/windows/wddm_kmdaf_listener_tests.cpp @@ -30,7 +30,7 @@ class WddmWithKmDafMock : public Wddm { using Wddm::mapGpuVirtualAddress; WddmWithKmDafMock(RootDeviceEnvironment &rootDeviceEnvironment) - : Wddm(std::make_unique(ADAPTER_HANDLE, LUID{}, rootDeviceEnvironment.executionEnvironment.osEnvironment.get(), std::make_unique()), + : Wddm(std::make_unique(ADAPTER_HANDLE, LUID{}, 1u, rootDeviceEnvironment.executionEnvironment.osEnvironment.get(), std::make_unique()), rootDeviceEnvironment) { kmDafListener.reset(new KmDafListenerMock); } diff --git a/opencl/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp b/opencl/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp index 761bb9d677..8e247bfa76 100644 --- a/opencl/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp +++ b/opencl/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp @@ -725,6 +725,7 @@ TEST_F(WddmMemoryManagerTest, givenWddmMemoryManagerWhenCreateFromNTHandleIsCall translator->isEnabled = true; std::unique_ptr hwDeviceId = std::make_unique(wddm->hwDeviceId->getAdapter(), wddm->hwDeviceId->getAdapterLuid(), + 1u, executionEnvironment->osEnvironment.get(), std::move(translator)); wddm->hwDeviceId.reset(hwDeviceId.release()); diff --git a/shared/source/os_interface/windows/hw_device_id.h b/shared/source/os_interface/windows/hw_device_id.h index 6d7534f759..6802a1d06e 100644 --- a/shared/source/os_interface/windows/hw_device_id.h +++ b/shared/source/os_interface/windows/hw_device_id.h @@ -21,7 +21,7 @@ class HwDeviceIdWddm : public HwDeviceId { public: static constexpr DriverModelType driverModelType = DriverModelType::WDDM; - HwDeviceIdWddm(D3DKMT_HANDLE adapterIn, LUID adapterLuidIn, OsEnvironment *osEnvironmentIn, std::unique_ptr umKmDataTranslator); + HwDeviceIdWddm(D3DKMT_HANDLE adapterIn, LUID adapterLuidIn, uint32_t adapterNodeMaskIn, OsEnvironment *osEnvironmentIn, std::unique_ptr umKmDataTranslator); Gdi *getGdi() const; constexpr D3DKMT_HANDLE getAdapter() const { return adapter; @@ -29,6 +29,9 @@ class HwDeviceIdWddm : public HwDeviceId { constexpr LUID getAdapterLuid() const { return adapterLuid; } + constexpr uint32_t getAdapterNodeMask() const { + return adapterNodeMask; + } ~HwDeviceIdWddm() override; UmKmDataTranslator *getUmKmDataTranslator() { @@ -37,6 +40,7 @@ class HwDeviceIdWddm : public HwDeviceId { protected: const LUID adapterLuid; + const uint32_t adapterNodeMask; std::unique_ptr umKmDataTranslator; OsEnvironment *osEnvironment; const D3DKMT_HANDLE adapter; diff --git a/shared/source/os_interface/windows/hw_device_id_win.cpp b/shared/source/os_interface/windows/hw_device_id_win.cpp index be442de653..e665aef57c 100644 --- a/shared/source/os_interface/windows/hw_device_id_win.cpp +++ b/shared/source/os_interface/windows/hw_device_id_win.cpp @@ -18,10 +18,10 @@ HwDeviceIdWddm::~HwDeviceIdWddm() { status = static_cast(osEnvironment)->gdi->closeAdapter(&closeAdapter); DEBUG_BREAK_IF(status != STATUS_SUCCESS); } -HwDeviceIdWddm::HwDeviceIdWddm(D3DKMT_HANDLE adapterIn, LUID adapterLuidIn, +HwDeviceIdWddm::HwDeviceIdWddm(D3DKMT_HANDLE adapterIn, LUID adapterLuidIn, uint32_t adapterNodeMaskIn, OsEnvironment *osEnvironmentIn, std::unique_ptr umKmDataTranslator) : HwDeviceId(DriverModelType::WDDM), - adapterLuid(adapterLuidIn), umKmDataTranslator(std::move(umKmDataTranslator)), + adapterLuid(adapterLuidIn), adapterNodeMask(adapterNodeMaskIn), umKmDataTranslator(std::move(umKmDataTranslator)), osEnvironment(osEnvironmentIn), adapter(adapterIn) { } diff --git a/shared/source/os_interface/windows/os_context_win.cpp b/shared/source/os_interface/windows/os_context_win.cpp index 453795ad67..ae02039650 100644 --- a/shared/source/os_interface/windows/os_context_win.cpp +++ b/shared/source/os_interface/windows/os_context_win.cpp @@ -69,6 +69,12 @@ void OsContextWin::getDeviceLuidArray(std::vector &luidData, size_t arr } }; +uint32_t OsContextWin::getDeviceNodeMask() { + auto *wddm = this->getWddm(); + auto *hwDeviceID = wddm->getHwDeviceId(); + return hwDeviceID->getAdapterNodeMask(); +} + OsContextWin::~OsContextWin() { if (contextInitialized && (false == this->wddm.skipResourceCleanup())) { wddm.getWddmInterface()->destroyHwQueue(hardwareQueue.handle); diff --git a/shared/source/os_interface/windows/os_context_win.h b/shared/source/os_interface/windows/os_context_win.h index cbcaaa7718..2add071e0f 100644 --- a/shared/source/os_interface/windows/os_context_win.h +++ b/shared/source/os_interface/windows/os_context_win.h @@ -36,6 +36,7 @@ class OsContextWin : public OsContext { static OsContext *create(OSInterface *osInterface, uint32_t rootDeviceIndex, uint32_t contextId, const EngineDescriptor &engineDescriptor); void reInitializeContext() override; void getDeviceLuidArray(std::vector &luidData, size_t arraySize); + uint32_t getDeviceNodeMask(); protected: void initializeContext() override; diff --git a/shared/source/os_interface/windows/wddm/wddm.cpp b/shared/source/os_interface/windows/wddm/wddm.cpp index ca66f15b0f..4ede83c116 100644 --- a/shared/source/os_interface/windows/wddm/wddm.cpp +++ b/shared/source/os_interface/windows/wddm/wddm.cpp @@ -350,7 +350,7 @@ bool validDriverStorePath(OsEnvironmentWin &osEnvironment, D3DKMT_HANDLE adapter return isCompatibleDriverStore(std::move(deviceRegistryPath)); } -std::unique_ptr createHwDeviceIdFromAdapterLuid(OsEnvironmentWin &osEnvironment, LUID adapterLuid) { +std::unique_ptr createHwDeviceIdFromAdapterLuid(OsEnvironmentWin &osEnvironment, LUID adapterLuid, uint32_t adapterNodeOrdinal) { D3DKMT_OPENADAPTERFROMLUID openAdapterData = {}; openAdapterData.AdapterLuid = adapterLuid; auto status = osEnvironment.gdi->openAdapterFromLuid(&openAdapterData); @@ -380,8 +380,8 @@ std::unique_ptr createHwDeviceIdFromAdapterLuid(OsEnvironmentWin if (0 == queryAdapterType.RenderSupported) { return nullptr; } - - return std::make_unique(openAdapterData.hAdapter, adapterLuid, &osEnvironment, std::move(umKmDataTranslator)); + uint32_t adapterNodeMask = 1 << adapterNodeOrdinal; + return std::make_unique(openAdapterData.hAdapter, adapterLuid, adapterNodeMask, &osEnvironment, std::move(umKmDataTranslator)); } std::vector> Wddm::discoverDevices(ExecutionEnvironment &executionEnvironment) { @@ -431,7 +431,7 @@ std::vector> Wddm::discoverDevices(ExecutionEnvironm continue; } - auto hwDeviceId = createHwDeviceIdFromAdapterLuid(*osEnvironment, adapterDesc.luid); + auto hwDeviceId = createHwDeviceIdFromAdapterLuid(*osEnvironment, adapterDesc.luid, i); if (hwDeviceId) { hwDeviceIds.push_back(std::unique_ptr(hwDeviceId.release())); } diff --git a/shared/test/common/fixtures/windows/memory_allocator_multi_device_fixture_windows.cpp b/shared/test/common/fixtures/windows/memory_allocator_multi_device_fixture_windows.cpp index 3bf1c1fb06..47f8c622e6 100644 --- a/shared/test/common/fixtures/windows/memory_allocator_multi_device_fixture_windows.cpp +++ b/shared/test/common/fixtures/windows/memory_allocator_multi_device_fixture_windows.cpp @@ -27,7 +27,7 @@ void MemoryAllocatorMultiDeviceSystemSpecificFixture::setUp(ExecutionEnvironment for (const auto &rootDeviceEnvironment : executionEnvironment.rootDeviceEnvironments) { gmm = std::make_unique(rootDeviceEnvironment->getGmmHelper(), nullptr, 0, 0, GMM_RESOURCE_USAGE_OCL_BUFFER, false, StorageInfo{}, true); auto wddm = static_cast(rootDeviceEnvironment->osInterface->getDriverModel()->as()); - wddm->hwDeviceId = std::make_unique(ADAPTER_HANDLE, LUID{}, osEnvironment, std::make_unique()); + wddm->hwDeviceId = std::make_unique(ADAPTER_HANDLE, LUID{}, 1u, osEnvironment, std::make_unique()); wddm->callBaseMapGpuVa = false; allocationInfo.pPrivateDriverData = gmm->gmmResourceInfo->peekHandle(); diff --git a/shared/test/common/mocks/mock_wddm.cpp b/shared/test/common/mocks/mock_wddm.cpp index 5d6b06e233..a71f8231d2 100644 --- a/shared/test/common/mocks/mock_wddm.cpp +++ b/shared/test/common/mocks/mock_wddm.cpp @@ -25,7 +25,7 @@ struct mockHwDeviceId : public HwDeviceIdWddm { using HwDeviceIdWddm::osEnvironment; }; -WddmMock::WddmMock(RootDeviceEnvironment &rootDeviceEnvironment) : Wddm(std::make_unique(ADAPTER_HANDLE, LUID{}, rootDeviceEnvironment.executionEnvironment.osEnvironment.get(), std::make_unique()), rootDeviceEnvironment) { +WddmMock::WddmMock(RootDeviceEnvironment &rootDeviceEnvironment) : Wddm(std::make_unique(ADAPTER_HANDLE, LUID{}, 1u, rootDeviceEnvironment.executionEnvironment.osEnvironment.get(), std::make_unique()), rootDeviceEnvironment) { if (!rootDeviceEnvironment.executionEnvironment.osEnvironment.get()) { rootDeviceEnvironment.executionEnvironment.osEnvironment = std::make_unique(); } diff --git a/shared/test/unit_test/os_interface/wddm_linux/configure_device_address_space_drm_or_wddm_test.cpp b/shared/test/unit_test/os_interface/wddm_linux/configure_device_address_space_drm_or_wddm_test.cpp index 0fa199b9f4..6e68f185bf 100644 --- a/shared/test/unit_test/os_interface/wddm_linux/configure_device_address_space_drm_or_wddm_test.cpp +++ b/shared/test/unit_test/os_interface/wddm_linux/configure_device_address_space_drm_or_wddm_test.cpp @@ -203,7 +203,7 @@ struct WddmLinuxTest : public ::testing::Test { void SetUp() override { osEnvironment = std::make_unique(); osEnvironment->gdi->closeAdapter = closeAdapterMock; - auto hwDeviceIdIn = std::make_unique(NULL_HANDLE, LUID{}, osEnvironment.get(), std::make_unique()); + auto hwDeviceIdIn = std::make_unique(NULL_HANDLE, LUID{}, 1u, osEnvironment.get(), std::make_unique()); this->hwDeviceId = hwDeviceIdIn.get(); auto &rootDeviceEnvironment = *mockExecEnv.rootDeviceEnvironments[0]; auto wddm = std::make_unique(std::move(hwDeviceIdIn), rootDeviceEnvironment); @@ -685,7 +685,7 @@ TEST(OSTimeWinLinuxTests, givenOSInterfaceWhenGetCpuGpuTimeThenGetCpuTimeFromOsT osEnvironment->gdi->reserveGpuVirtualAddress = reserveDeviceAddressSpaceMock; NEO::MockExecutionEnvironment mockExecEnv; NEO::MockRootDeviceEnvironment mockRootDeviceEnvironment{mockExecEnv}; - hwDeviceIdIn.reset(new NEO::HwDeviceIdWddm(NULL_HANDLE, LUID{}, osEnvironment.get(), std::make_unique())); + hwDeviceIdIn.reset(new NEO::HwDeviceIdWddm(NULL_HANDLE, LUID{}, 1u, osEnvironment.get(), std::make_unique())); std::unique_ptr osInterface(new NEO::OSInterface()); diff --git a/shared/test/unit_test/os_interface/windows/wddm_adapter_luid_tests.cpp b/shared/test/unit_test/os_interface/windows/wddm_adapter_luid_tests.cpp index 65e0ba8b16..ac1eee241b 100644 --- a/shared/test/unit_test/os_interface/windows/wddm_adapter_luid_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/wddm_adapter_luid_tests.cpp @@ -12,12 +12,12 @@ #include "shared/test/common/test_macros/hw_test.h" namespace NEO { -std::unique_ptr createHwDeviceIdFromAdapterLuid(OsEnvironmentWin &osEnvironment, LUID adapterLuid); +std::unique_ptr createHwDeviceIdFromAdapterLuid(OsEnvironmentWin &osEnvironment, LUID adapterLuid, uint32_t adapterNodeOrdinal); using WddmOsContextDeviceLuidTests = WddmFixtureLuid; TEST_F(WddmFixtureLuid, givenValidOsContextAndLuidDataRequestThenValidDataReturned) { LUID adapterLuid = {0x12, 0x1234}; - wddm->hwDeviceId = NEO::createHwDeviceIdFromAdapterLuid(*osEnvironment, adapterLuid); + wddm->hwDeviceId = NEO::createHwDeviceIdFromAdapterLuid(*osEnvironment, adapterLuid, 1u); std::vector luidData; size_t arraySize = 8; osContext->getDeviceLuidArray(luidData, arraySize); @@ -25,4 +25,10 @@ TEST_F(WddmFixtureLuid, givenValidOsContextAndLuidDataRequestThenValidDataReturn memcpy_s(&luid, sizeof(uint64_t), luidData.data(), sizeof(uint8_t) * luidData.size()); EXPECT_NE(luid, (uint64_t)0); } +TEST_F(WddmFixtureLuid, givenValidOsContextAndGetDeviceNodeMaskThenValidDataReturned) { + LUID adapterLuid = {0x12, 0x1234}; + wddm->hwDeviceId = NEO::createHwDeviceIdFromAdapterLuid(*osEnvironment, adapterLuid, 2u); + uint32_t adapterDeviceMask = osContext->getDeviceNodeMask(); + EXPECT_EQ(adapterDeviceMask, (uint32_t)4); +} } // namespace NEO \ No newline at end of file diff --git a/shared/test/unit_test/os_interface/windows/wddm_tests.cpp b/shared/test/unit_test/os_interface/windows/wddm_tests.cpp index d7690475f8..ea5a0ee908 100644 --- a/shared/test/unit_test/os_interface/windows/wddm_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/wddm_tests.cpp @@ -13,7 +13,7 @@ #include "shared/test/common/test_macros/hw_test.h" namespace NEO { -std::unique_ptr createHwDeviceIdFromAdapterLuid(OsEnvironmentWin &osEnvironment, LUID adapterLuid); +std::unique_ptr createHwDeviceIdFromAdapterLuid(OsEnvironmentWin &osEnvironment, LUID adapterLuid, uint32_t nodeMask); using WddmTests = WddmTestWithMockGdiDll; @@ -105,7 +105,7 @@ TEST(WddmPciSpeedInfoTest, WhenGetPciSpeedInfoIsCalledThenUnknownIsReturned) { } TEST_F(WddmTests, whenGetAdapterLuidThenLuidIsReturned) { - HwDeviceIdWddm *hwDeviceId = new HwDeviceIdWddm(0, {0, 0}, executionEnvironment->osEnvironment.get(), nullptr); + HwDeviceIdWddm *hwDeviceId = new HwDeviceIdWddm(0, {0, 0}, 1u, executionEnvironment->osEnvironment.get(), nullptr); wddm->hwDeviceId.reset(hwDeviceId); auto luid = wddm->getAdapterLuid();