@@ -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