Răsfoiți Sursa

Merge pull request #11450 from lat9nq/no-vk-device-fix

configure_graphics: Fix handling of broken Vulkan
liamwhite 2 ani în urmă
părinte
comite
eb9e847380
2 a modificat fișierele cu 26 adăugiri și 13 ștergeri
  1. 16 12
      src/yuzu/configuration/configure_graphics.cpp
  2. 10 1
      src/yuzu/main.cpp

+ 16 - 12
src/yuzu/configuration/configure_graphics.cpp

@@ -193,14 +193,10 @@ void ConfigureGraphics::PopulateVSyncModeSelection() {
                             : vsync_mode_combobox_enum_map[current_index];
     int index{};
     const int device{vulkan_device_combobox->currentIndex()}; //< current selected Vulkan device
-    if (device == -1) {
-        // Invalid device
-        return;
-    }
 
     const auto& present_modes = //< relevant vector of present modes for the selected device or API
-        backend == Settings::RendererBackend::Vulkan ? device_present_modes[device]
-                                                     : default_present_modes;
+        backend == Settings::RendererBackend::Vulkan && device > -1 ? device_present_modes[device]
+                                                                    : default_present_modes;
 
     vsync_mode_combobox->clear();
     vsync_mode_combobox_enum_map.clear();
@@ -497,11 +493,19 @@ void ConfigureGraphics::RetrieveVulkanDevices() {
 }
 
 Settings::RendererBackend ConfigureGraphics::GetCurrentGraphicsBackend() const {
-    if (!Settings::IsConfiguringGlobal() && !api_restore_global_button->isEnabled()) {
-        return Settings::values.renderer_backend.GetValue(true);
+    const auto selected_backend = [&]() {
+        if (!Settings::IsConfiguringGlobal() && !api_restore_global_button->isEnabled()) {
+            return Settings::values.renderer_backend.GetValue(true);
+        }
+        return static_cast<Settings::RendererBackend>(
+            combobox_translations.at(Settings::EnumMetadata<Settings::RendererBackend>::Index())
+                .at(api_combobox->currentIndex())
+                .first);
+    }();
+
+    if (selected_backend == Settings::RendererBackend::Vulkan &&
+        UISettings::values.has_broken_vulkan) {
+        return Settings::RendererBackend::OpenGL;
     }
-    return static_cast<Settings::RendererBackend>(
-        combobox_translations.at(Settings::EnumMetadata<Settings::RendererBackend>::Index())
-            .at(api_combobox->currentIndex())
-            .first);
+    return selected_backend;
 }

+ 10 - 1
src/yuzu/main.cpp

@@ -442,8 +442,13 @@ GMainWindow::GMainWindow(std::unique_ptr<Config> config_, bool has_broken_vulkan
                                 "#yuzu-starts-with-the-error-broken-vulkan-installation-detected'>"
                                 "here for instructions to fix the issue</a>."));
 
+#ifdef HAS_OPENGL
         Settings::values.renderer_backend = Settings::RendererBackend::OpenGL;
+#else
+        Settings::values.renderer_backend = Settings::RendererBackend::Null;
+#endif
 
+        UpdateAPIText();
         renderer_status_button->setDisabled(true);
         renderer_status_button->setChecked(false);
     } else {
@@ -3844,10 +3849,14 @@ void GMainWindow::OnToggleAdaptingFilter() {
 
 void GMainWindow::OnToggleGraphicsAPI() {
     auto api = Settings::values.renderer_backend.GetValue();
-    if (api == Settings::RendererBackend::OpenGL) {
+    if (api != Settings::RendererBackend::Vulkan) {
         api = Settings::RendererBackend::Vulkan;
     } else {
+#ifdef HAS_OPENGL
         api = Settings::RendererBackend::OpenGL;
+#else
+        api = Settings::RendererBackend::Null;
+#endif
     }
     Settings::values.renderer_backend.SetValue(api);
     renderer_status_button->setChecked(api == Settings::RendererBackend::Vulkan);