@@ -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
8442extern " 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;
0 commit comments