@@ -21,14 +21,15 @@ static bool IsSoftwareAdapter(IDXGIAdapter1* adapter) {
21
21
return desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE || (is_basic_render_driver_vendor_id && is_basic_render_driver_device_id);
22
22
};
23
23
24
- static std::vector<ComPtr<IDXGIAdapter1>> EnumerateAdapters (PLUID device_luid = nullptr ) {
24
+ static std::vector<ComPtr<IDXGIAdapter1>> EnumerateAdapters (PLUID device_luid = nullptr ,
25
+ uint32_t * deviceIndex = nullptr ) {
25
26
ComPtr<IDXGIFactory4> dxgi_factory;
26
27
THROW_IF_FAILED (CreateDXGIFactory (IID_PPV_ARGS (&dxgi_factory)));
27
28
28
29
std::vector<ComPtr<IDXGIAdapter1>> adapter_infos;
29
30
30
31
ComPtr<IDXGIFactory6> dxgi_factory6;
31
- if (SUCCEEDED (dxgi_factory.As (&dxgi_factory6)) && !device_luid) {
32
+ if (SUCCEEDED (dxgi_factory.As (&dxgi_factory6)) && !device_luid && !deviceIndex ) {
32
33
// Enumerate adapters by performance. This only works in Windows 10 Version 1803 and later.
33
34
ComPtr<IDXGIAdapter1> adapter;
34
35
for (uint32_t adapter_index = 0 ;
@@ -52,7 +53,7 @@ static std::vector<ComPtr<IDXGIAdapter1>> EnumerateAdapters(PLUID device_luid =
52
53
adapter_infos.emplace_back (std::move (adapter));
53
54
}
54
55
}
55
- } else {
56
+ } else if (device_luid) {
56
57
// Enumerate adapters without ordering.
57
58
ComPtr<IDXGIAdapter1> adapter;
58
59
for (uint32_t adapter_index = 0 ; dxgi_factory->EnumAdapters1 (adapter_index, &adapter) != DXGI_ERROR_NOT_FOUND; adapter_index++) {
@@ -66,7 +67,7 @@ static std::vector<ComPtr<IDXGIAdapter1>> EnumerateAdapters(PLUID device_luid =
66
67
ComPtr<ID3D12Device> d3d12_device;
67
68
THROW_IF_FAILED (D3D12CreateDevice (adapter.Get (), D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS (&d3d12_device)));
68
69
69
- if (d3d12_device && device_luid ) {
70
+ if (d3d12_device) {
70
71
DXGI_ADAPTER_DESC1 description = {};
71
72
THROW_IF_FAILED (adapter->GetDesc1 (&description));
72
73
@@ -75,24 +76,49 @@ static std::vector<ComPtr<IDXGIAdapter1>> EnumerateAdapters(PLUID device_luid =
75
76
adapter_infos.emplace_back (std::move (adapter));
76
77
break ;
77
78
}
79
+ }
80
+ }
81
+ } else {
82
+ // Enumerate adapters without ordering.
83
+ ComPtr<IDXGIAdapter1> adapter;
84
+ uint32_t hwAdapterIndex = 0 ;
85
+ for (uint32_t adapter_index = 0 ; dxgi_factory->EnumAdapters1 (adapter_index, &adapter) != DXGI_ERROR_NOT_FOUND; adapter_index++) {
86
+ // We can't assume the ordering of hardware and software adapters, so keep looping. This path should only execute on Windows 10
87
+ // version 1709 or earlier; IDD (e.g. remote desktop) adapters do not exist when taking this code path.
88
+ if (IsSoftwareAdapter (adapter.Get ())) {
89
+ continue ;
90
+ }
91
+
92
+ // Make sure that we are able to create the device
93
+ ComPtr<ID3D12Device> d3d12_device;
94
+ THROW_IF_FAILED (D3D12CreateDevice (adapter.Get (), D3D_FEATURE_LEVEL_11_0, IID_PPV_ARGS (&d3d12_device)));
95
+
96
+ if (d3d12_device && deviceIndex) {
97
+ // get device specified by the deviceIndex
98
+ if (*deviceIndex == hwAdapterIndex) {
99
+ adapter_infos.emplace_back (std::move (adapter));
100
+ break ;
101
+ }
78
102
} else if (d3d12_device) {
79
103
adapter_infos.emplace_back (std::move (adapter));
80
104
}
105
+
106
+ hwAdapterIndex++;
81
107
}
82
108
}
83
109
84
110
return adapter_infos;
85
111
}
86
112
87
- static ComPtr<IDXGIAdapter1> CreateAdapter (PLUID device_luid = nullptr ) {
88
- auto filtered_adapters = EnumerateAdapters (device_luid);
113
+ static ComPtr<IDXGIAdapter1> CreateAdapter (PLUID device_luid = nullptr , uint32_t * deviceIndex = nullptr ) {
114
+ auto filtered_adapters = EnumerateAdapters (device_luid, deviceIndex );
89
115
if (filtered_adapters.empty ()) {
90
116
throw std::runtime_error (" No adapter is available for DML." );
91
117
}
92
118
return filtered_adapters.front ();
93
119
}
94
120
95
- DmlObjects CreateDmlObjects (const std::string& current_module_path, PLUID device_luid) {
121
+ DmlObjects CreateDmlObjects (const std::string& current_module_path, PLUID device_luid, uint32_t * deviceIndex ) {
96
122
D3D12_COMMAND_QUEUE_DESC command_queue_description = {
97
123
D3D12_COMMAND_LIST_TYPE_COMPUTE,
98
124
0 ,
@@ -102,7 +128,7 @@ DmlObjects CreateDmlObjects(const std::string& current_module_path, PLUID device
102
128
103
129
DmlObjects dml_objects;
104
130
105
- auto adapter = CreateAdapter (device_luid);
131
+ auto adapter = CreateAdapter (device_luid, deviceIndex );
106
132
ComPtr<ID3D12SDKConfiguration1> d3d12_sdk_config;
107
133
ComPtr<ID3D12DeviceFactory> d3d12_factory;
108
134
0 commit comments