From 7828a8ee6ac9e61918e357716e883433105dbcc8 Mon Sep 17 00:00:00 2001 From: Mateusz Jablonski Date: Thu, 17 Jun 2021 19:26:11 +0000 Subject: [PATCH] Correct adapter detection don't break when first adapter is incompatible Related-To: NEO-3691 Signed-off-by: Mateusz Jablonski --- .../os_interface/windows/ult_dxcore_factory.cpp | 1 + .../os_interface/windows/ult_dxcore_factory.h | 14 +++++++++++--- .../os_interface/windows/wddm20_tests.cpp | 9 +++++++++ shared/source/os_interface/windows/wddm/wddm.cpp | 2 +- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/opencl/test/unit_test/os_interface/windows/ult_dxcore_factory.cpp b/opencl/test/unit_test/os_interface/windows/ult_dxcore_factory.cpp index 2239a14e8f..8d97db95b0 100644 --- a/opencl/test/unit_test/os_interface/windows/ult_dxcore_factory.cpp +++ b/opencl/test/unit_test/os_interface/windows/ult_dxcore_factory.cpp @@ -19,6 +19,7 @@ void WINAPI ULTGetSystemInfo(SYSTEM_INFO *pSystemInfo) { } const char *UltDxCoreAdapter::description = "Intel"; +bool UltDXCoreAdapterList::firstInvalid = false; extern uint32_t numRootDevicesToEnum = 1; diff --git a/opencl/test/unit_test/os_interface/windows/ult_dxcore_factory.h b/opencl/test/unit_test/os_interface/windows/ult_dxcore_factory.h index b0ab01874b..e0aa74a0f9 100644 --- a/opencl/test/unit_test/os_interface/windows/ult_dxcore_factory.h +++ b/opencl/test/unit_test/os_interface/windows/ult_dxcore_factory.h @@ -20,6 +20,7 @@ static constexpr auto error = 1; class UltDxCoreAdapter : public IDXCoreAdapter { public: const static char *description; + LUID luid = {0u, 0x1234u}; bool STDMETHODCALLTYPE IsValid() override { return true; } @@ -52,8 +53,8 @@ class UltDxCoreAdapter : public IDXCoreAdapter { memcpy_s(propertyData, bufferSize, description, requiredSize); break; case DXCoreAdapterProperty::InstanceLuid: - reinterpret_cast(propertyData)->HighPart = 0x1234; - reinterpret_cast(propertyData)->LowPart = 0; + reinterpret_cast(propertyData)->HighPart = luid.HighPart; + reinterpret_cast(propertyData)->LowPart = luid.LowPart; break; case DXCoreAdapterProperty::HardwareID: { DXCoreHardwareID ret = {}; @@ -137,8 +138,15 @@ class UltDxCoreAdapter : public IDXCoreAdapter { extern uint32_t numRootDevicesToEnum; class UltDXCoreAdapterList : public IDXCoreAdapterList { public: + static bool firstInvalid; HRESULT STDMETHODCALLTYPE GetAdapter(uint32_t index, REFIID riid, _COM_Outptr_ void **ppvAdapter) override { - *reinterpret_cast(ppvAdapter) = new UltDxCoreAdapter; + auto adapter = new UltDxCoreAdapter; + if (firstInvalid && 0 == index) { + adapter->luid.HighPart = 0u; + adapter->luid.LowPart = 0u; + } + + *reinterpret_cast(ppvAdapter) = adapter; return S_OK; } uint32_t STDMETHODCALLTYPE GetAdapterCount() override { 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 5f276a56f2..fcc4c749a1 100644 --- a/opencl/test/unit_test/os_interface/windows/wddm20_tests.cpp +++ b/opencl/test/unit_test/os_interface/windows/wddm20_tests.cpp @@ -128,6 +128,15 @@ TEST(WddmDiscoverDevices, givenMultipleRootDevicesExposedWhenCreateMultipleRootD EXPECT_EQ(requestedNumRootDevices, hwDeviceIds.size()); } +TEST(WddmDiscoverDevices, givenInvalidFirstAdapterWhenDiscoveringAdaptersThenReturnAllValidAdapters) { + VariableBackup backup{&numRootDevicesToEnum, 2u}; + VariableBackup backup2{&UltDXCoreAdapterList::firstInvalid, true}; + + ExecutionEnvironment executionEnvironment; + auto hwDeviceIds = OSInterface::discoverDevices(executionEnvironment); + EXPECT_EQ(1u, hwDeviceIds.size()); +} + TEST(WddmDiscoverDevices, givenMultipleRootDevicesExposedWhenCreateMultipleRootDevicesFlagIsSetToGreaterValueThenDiscoverSpecifiedNumberOfDevices) { DebugManagerStateRestore restorer{}; VariableBackup backup{&numRootDevicesToEnum}; diff --git a/shared/source/os_interface/windows/wddm/wddm.cpp b/shared/source/os_interface/windows/wddm/wddm.cpp index 0f8431729d..3bd0b10ab6 100644 --- a/shared/source/os_interface/windows/wddm/wddm.cpp +++ b/shared/source/os_interface/windows/wddm/wddm.cpp @@ -345,7 +345,7 @@ std::vector> Wddm::discoverDevices(ExecutionEnvironm hwDeviceIds.push_back(std::unique_ptr(hwDeviceId.release())); } - if (hwDeviceIds.size() == numRootDevices) { + if (!hwDeviceIds.empty() && hwDeviceIds.size() == numRootDevices) { break; } }