Skip to content
This repository was archived by the owner on Nov 27, 2024. It is now read-only.

Commit de788da

Browse files
committed
Sort Adapters by performance
1 parent e4f9bca commit de788da

File tree

2 files changed

+6
-50
lines changed

2 files changed

+6
-50
lines changed

OnnxStack.Adapter/AdapterInfo.cpp

+5-47
Original file line numberDiff line numberDiff line change
@@ -38,63 +38,20 @@ class DxgiModule
3838
}
3939
};
4040

41-
extern "C" __declspec(dllexport) int __cdecl GetAdapter(bool preferHighPerformance)
42-
{
43-
DxgiModule dxgi;
44-
45-
ComPtr<IDXGIFactory6> factory = dxgi.CreateFactory();;
46-
if (!factory)
47-
{
48-
return 0;
49-
}
50-
51-
ComPtr<IDXGIAdapter1> adapter;
52-
53-
// Store LUIDs for hardware adapters in original unsorted order.
54-
std::vector<std::pair<int, LUID>> adaptersUnsortedIndexAndLuid;
55-
for (int i = 0; factory->EnumAdapters1(i, adapter.ReleaseAndGetAddressOf()) != DXGI_ERROR_NOT_FOUND; i++)
56-
{
57-
DXGI_ADAPTER_DESC desc = {};
58-
RETURN_IF_FAILED(adapter->GetDesc(&desc));
59-
adaptersUnsortedIndexAndLuid.emplace_back(i, desc.AdapterLuid);
60-
}
61-
62-
// Find the first adapter meeting GPU preference.
63-
DXGI_ADAPTER_DESC preferredAdapterDesc = {};
64-
{
65-
DXGI_GPU_PREFERENCE gpuPreference = preferHighPerformance ? DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE : DXGI_GPU_PREFERENCE_MINIMUM_POWER;
66-
RETURN_IF_FAILED(factory->EnumAdapterByGpuPreference(0, gpuPreference, IID_PPV_ARGS(adapter.ReleaseAndGetAddressOf())));
67-
RETURN_IF_FAILED(adapter->GetDesc(&preferredAdapterDesc));
68-
}
69-
70-
// Look up the index of the preferred adapter in the unsorted list order.
71-
for (auto& hardwareAdapterEntry : adaptersUnsortedIndexAndLuid)
72-
{
73-
if (hardwareAdapterEntry.second.HighPart == preferredAdapterDesc.AdapterLuid.HighPart &&
74-
hardwareAdapterEntry.second.LowPart == preferredAdapterDesc.AdapterLuid.LowPart)
75-
{
76-
return hardwareAdapterEntry.first;
77-
}
78-
}
79-
80-
return 0;
81-
}
82-
8341

8442
extern "C" __declspec(dllexport) void __cdecl GetAdapters(AdapterInfo * adapterArray)
8543
{
8644
DxgiModule dxgi;
87-
88-
ComPtr<IDXGIFactory6> factory = dxgi.CreateFactory();;
45+
ComPtr<IDXGIFactory6> factory = dxgi.CreateFactory();
8946
if (!factory)
9047
return;
9148

9249
int adapterCount = 0;
9350
ComPtr<IDXGIAdapter1> adapter;
94-
for (int i = 0; factory->EnumAdapters1(i, adapter.ReleaseAndGetAddressOf()) != DXGI_ERROR_NOT_FOUND; i++)
51+
for (int i = 0; factory->EnumAdapterByGpuPreference(i, DXGI_GPU_PREFERENCE_HIGH_PERFORMANCE, IID_PPV_ARGS(adapter.ReleaseAndGetAddressOf())) != DXGI_ERROR_NOT_FOUND; i++)
9552
{
96-
DXGI_ADAPTER_DESC desc = {};
97-
HRESULT hr = adapter->GetDesc(&desc);
53+
DXGI_ADAPTER_DESC1 desc = {};
54+
HRESULT hr = adapter->GetDesc1(&desc);
9855
if (SUCCEEDED(hr))
9956
{
10057
AdapterInfo info{};
@@ -107,6 +64,7 @@ extern "C" __declspec(dllexport) void __cdecl GetAdapters(AdapterInfo * adapterA
10764
info.SharedSystemMemory = desc.SharedSystemMemory;
10865
info.SubSysId = desc.SubSysId;
10966
info.VendorId = desc.VendorId;
67+
info.Flags = desc.Flags;
11068
wcsncpy_s(info.Description, desc.Description, _TRUNCATE);
11169
adapterArray[adapterCount] = info;
11270
++adapterCount;

OnnxStack.Adapter/AdapterInfo.h

+1-3
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,8 @@ struct AdapterInfo
1111
SIZE_T DedicatedSystemMemory;
1212
SIZE_T SharedSystemMemory;
1313
LUID AdapterLuid;
14+
UINT Flags;
1415
WCHAR Description[128];
1516
};
1617

17-
18-
extern "C" __declspec(dllexport) int __cdecl GetAdapter(bool preferHighPerformance);
19-
2018
extern "C" __declspec(dllexport) void __cdecl GetAdapters(AdapterInfo * adapterArray);

0 commit comments

Comments
 (0)