Skip to content

Commit af3296a

Browse files
committed
Improve RenderingContextDriverD3D12::_initialize_devices
1 parent 0870525 commit af3296a

File tree

1 file changed

+35
-16
lines changed

1 file changed

+35
-16
lines changed

drivers/d3d12/rendering_context_driver_d3d12.cpp

Lines changed: 35 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -176,30 +176,49 @@ Error RenderingContextDriverD3D12::_initialize_devices() {
176176

177177
ERR_FAIL_COND_V_MSG(adapters.is_empty(), ERR_CANT_CREATE, "Adapters enumeration reported zero accessible devices.");
178178

179-
// Fill the device descriptions with the adapters.
180-
driver_devices.resize(adapters.size());
181-
for (uint32_t i = 0; i < adapters.size(); ++i) {
182-
DXGI_ADAPTER_DESC1 desc = {};
183-
adapters[i]->GetDesc1(&desc);
179+
D3D_FEATURE_LEVEL requested_feature_level = D3D_FEATURE_LEVEL_11_0;
180+
if (D3D12Hooks::get_singleton() != nullptr) {
181+
requested_feature_level = D3D12Hooks::get_singleton()->get_feature_level();
182+
}
184183

185-
Device &device = driver_devices[i];
186-
device.name = desc.Description;
187-
device.vendor = desc.VendorId;
188-
device.workarounds = Workarounds();
184+
PFN_D3D12_CREATE_DEVICE d3d_D3D12CreateDevice = nullptr;
185+
if (device_factory == nullptr) {
186+
d3d_D3D12CreateDevice = (PFN_D3D12_CREATE_DEVICE)(void *)GetProcAddress(lib_d3d12, "D3D12CreateDevice");
187+
ERR_FAIL_NULL_V(d3d_D3D12CreateDevice, ERR_CANT_CREATE);
188+
}
189189

190-
if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) {
191-
device.type = DEVICE_TYPE_CPU;
190+
HRESULT create_res;
191+
for (uint32_t i = 0; i < adapters.size(); ++i) {
192+
if (device_factory) {
193+
create_res = device_factory->CreateDevice(adapter, requested_feature_level, __uuidof(ID3D12Device), nullptr);
192194
} else {
193-
const bool has_dedicated_vram = desc.DedicatedVideoMemory > 0;
194-
device.type = has_dedicated_vram ? DEVICE_TYPE_DISCRETE_GPU : DEVICE_TYPE_INTEGRATED_GPU;
195+
create_res = d3d_D3D12CreateDevice(adapter, requested_feature_level, __uuidof(ID3D12Device), nullptr);
195196
}
196-
}
197197

198-
// Release all created adapters.
199-
for (uint32_t i = 0; i < adapters.size(); ++i) {
198+
if (SUCCEEDED(create_res)) {
199+
DXGI_ADAPTER_DESC1 desc = {};
200+
adapters[i]->GetDesc1(&desc);
201+
202+
Device device;
203+
device.name = desc.Description;
204+
device.vendor = desc.VendorId;
205+
device.workarounds = Workarounds();
206+
207+
if (desc.Flags & DXGI_ADAPTER_FLAG_SOFTWARE) {
208+
device.type = DEVICE_TYPE_CPU;
209+
} else {
210+
const bool has_dedicated_vram = desc.DedicatedVideoMemory > 0;
211+
device.type = has_dedicated_vram ? DEVICE_TYPE_DISCRETE_GPU : DEVICE_TYPE_INTEGRATED_GPU;
212+
}
213+
driver_devices.push_back(device);
214+
}
215+
216+
// Release all created adapters.
200217
adapters[i]->Release();
201218
}
202219

220+
ERR_FAIL_COND_V_MSG(driver_devices.is_empty(), ERR_CANT_CREATE, "No D3D12-compatible GPU driver found. Your system may not support Direct3D 12, or your GPU drivers are outdated.");
221+
203222
ComPtr<IDXGIFactory5> factory_5;
204223
dxgi_factory.As(&factory_5);
205224
if (factory_5 != nullptr) {

0 commit comments

Comments
 (0)