@@ -161,26 +161,41 @@ namespace dxvk {
161161
162162
163163 Rc<DxvkDevice> DxvkAdapter::createDevice () {
164+ Rc<DxvkDevice> device = createDevice (false );
165+
166+ if (!device)
167+ device = createDevice (true );
168+
169+ if (!device)
170+ throw DxvkError (" Failed to initialize DXVK device." );
171+
172+ return device;
173+ }
174+
175+
176+ Rc<DxvkDevice> DxvkAdapter::createDevice (bool safeMode) {
164177 auto vk = m_instance->vki ();
165178
179+ DxvkDeviceCapabilities caps (*m_instance, m_handle, nullptr , safeMode);
180+
166181 Logger::info (" Creating device:" );
167- m_capabilities .logDeviceInfo ();
182+ caps .logDeviceInfo ();
168183
169184 // Get device features to enable
170185 size_t featureBlobSize = 0u ;
171- m_capabilities .queryDeviceFeatures (&featureBlobSize, nullptr );
186+ caps .queryDeviceFeatures (&featureBlobSize, nullptr );
172187
173188 std::vector<char > featureBlob (featureBlobSize);
174- m_capabilities .queryDeviceFeatures (&featureBlobSize, featureBlob.data ());
189+ caps .queryDeviceFeatures (&featureBlobSize, featureBlob.data ());
175190
176191 auto features = reinterpret_cast <const VkPhysicalDeviceFeatures2*>(featureBlob.data ());
177192
178193 // Get extension list and add extra extensions
179194 uint32_t extensionCount = 0u ;
180- m_capabilities .queryDeviceExtensions (&extensionCount, nullptr );
195+ caps .queryDeviceExtensions (&extensionCount, nullptr );
181196
182197 std::vector<VkExtensionProperties> extensions (extensionCount);
183- m_capabilities .queryDeviceExtensions (&extensionCount, extensions.data ());
198+ caps .queryDeviceExtensions (&extensionCount, extensions.data ());
184199
185200 for (const auto & extra : m_extraExtensions) {
186201 bool found = false ;
@@ -202,13 +217,13 @@ namespace dxvk {
202217 extensionNames.push_back (ext.extensionName );
203218
204219 // Query queue infos
205- DxvkDeviceQueueMapping queueMapping = m_capabilities .getQueueMapping ();
220+ DxvkDeviceQueueMapping queueMapping = caps .getQueueMapping ();
206221
207222 uint32_t queueCount = { };
208- m_capabilities .queryDeviceQueues (&queueCount, nullptr );
223+ caps .queryDeviceQueues (&queueCount, nullptr );
209224
210225 std::vector<VkDeviceQueueCreateInfo> queues (queueCount, { VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO });
211- m_capabilities .queryDeviceQueues (&queueCount, queues.data ());
226+ caps .queryDeviceQueues (&queueCount, queues.data ());
212227
213228 uint32_t priorityCount = 0u ;
214229
@@ -224,7 +239,7 @@ namespace dxvk {
224239 priorityIndex += q.queueCount ;
225240 }
226241
227- m_capabilities .queryDeviceQueues (&queueCount, queues.data ());
242+ caps .queryDeviceQueues (&queueCount, queues.data ());
228243
229244 // Create the actual Vulkan device
230245 VkDeviceCreateInfo deviceInfo = { VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO };
@@ -238,8 +253,11 @@ namespace dxvk {
238253 VkDevice device = VK_NULL_HANDLE ;
239254 VkResult vr = vk->vkCreateDevice (m_handle, &deviceInfo, nullptr , &device);
240255
241- if (vr)
242- throw DxvkError (str::format (" Failed to create Vulkan device: " , vr));
256+ if (vr) {
257+ Logger::err (str::format (" Failed to create Vulkan device: " , vr,
258+ safeMode ? " " : " , retrying 'safe mode'." ));
259+ return nullptr ;
260+ }
243261
244262 Rc<vk::DeviceFn> vkd = new vk::DeviceFn (vk, true , device);
245263
@@ -248,7 +266,7 @@ namespace dxvk {
248266 deviceQueues.transfer = getDeviceQueue (vkd, queueMapping.transfer );
249267 deviceQueues.sparse = getDeviceQueue (vkd, queueMapping.sparse );
250268
251- return new DxvkDevice (m_instance, this , vkd, m_capabilities .getFeatures (), deviceQueues, DxvkQueueCallback ());
269+ return new DxvkDevice (m_instance, this , vkd, caps .getFeatures (), deviceQueues, DxvkQueueCallback ());
252270 }
253271
254272
0 commit comments