From 500b01076e1a96b9c133ff663daad6f9dd8e4039 Mon Sep 17 00:00:00 2001
From: lat9nq <lat9nq@gmail.com>
Date: Sun, 29 May 2022 22:26:27 -0400
Subject: [PATCH] yuzu-qt: Make has_broken_vulkan only for crashes

Being able to catch and handle a Vulkan exception is not what this is
for.
---
 src/yuzu/check_vulkan.cpp                     |  8 +++++---
 src/yuzu/check_vulkan.h                       |  5 +++++
 src/yuzu/configuration/configure_graphics.cpp |  4 +---
 src/yuzu/main.cpp                             | 10 +++++-----
 src/yuzu/uisettings.h                         |  1 +
 5 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/src/yuzu/check_vulkan.cpp b/src/yuzu/check_vulkan.cpp
index 1b21efe696..e6d66ab349 100644
--- a/src/yuzu/check_vulkan.cpp
+++ b/src/yuzu/check_vulkan.cpp
@@ -1,6 +1,8 @@
+// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
 #include "video_core/vulkan_common/vulkan_wrapper.h"
 
-#include <exception>
 #include <filesystem>
 #include <fstream>
 #include "common/fs/fs.h"
@@ -42,8 +44,8 @@ bool CheckVulkan() {
 
     } catch (const Vulkan::vk::Exception& exception) {
         LOG_ERROR(Frontend, "Failed to initialize Vulkan: {}", exception.what());
-        UISettings::values.has_broken_vulkan = true;
-        return false;
+        // Don't set has_broken_vulkan to true here: we care when loading Vulkan crashes the
+        // application, not when we can handle it.
     }
 
     std::filesystem::remove(temp_file_loc);
diff --git a/src/yuzu/check_vulkan.h b/src/yuzu/check_vulkan.h
index 3b199d3bbb..e4ea935822 100644
--- a/src/yuzu/check_vulkan.h
+++ b/src/yuzu/check_vulkan.h
@@ -1 +1,6 @@
+// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
 bool CheckVulkan();
diff --git a/src/yuzu/configuration/configure_graphics.cpp b/src/yuzu/configuration/configure_graphics.cpp
index 482a6a8ab5..70015a3734 100644
--- a/src/yuzu/configuration/configure_graphics.cpp
+++ b/src/yuzu/configuration/configure_graphics.cpp
@@ -64,6 +64,7 @@ ConfigureGraphics::ConfigureGraphics(const Core::System& system_, QWidget* paren
 
         if (RetrieveVulkanDevices()) {
             ui->api->setEnabled(true);
+            ui->button_check_vulkan->hide();
 
             for (const auto& device : vulkan_devices) {
                 ui->device->addItem(device);
@@ -356,9 +357,6 @@ bool ConfigureGraphics::RetrieveVulkanDevices() try {
         vulkan_devices.push_back(QString::fromStdString(name));
     }
 
-    UISettings::values.has_broken_vulkan = false;
-    ui->button_check_vulkan->setVisible(false);
-
     return true;
 } catch (const Vulkan::vk::Exception& exception) {
     LOG_ERROR(Frontend, "Failed to enumerate devices with error: {}", exception.what());
diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp
index 71802cfc2b..ff1afa56e7 100644
--- a/src/yuzu/main.cpp
+++ b/src/yuzu/main.cpp
@@ -299,11 +299,7 @@ GMainWindow::GMainWindow()
     MigrateConfigFiles();
 
     if (!CheckVulkan()) {
-        QMessageBox::warning(
-            this, tr("Broken Vulkan Installation Detected"),
-            tr("Vulkan initialization failed on the previous boot. Please update your graphics "
-               "driver, then re-check your Vulkan installation by accessing the Graphics "
-               "configuration and clicking \"Check for Working Vulkan\"."));
+        QMessageBox::warning(this, tr("Broken Vulkan Installation Detected"), tr(""));
     }
     if (UISettings::values.has_broken_vulkan) {
         Settings::values.renderer_backend = Settings::RendererBackend::OpenGL;
@@ -2788,6 +2784,10 @@ void GMainWindow::OnConfigure() {
         mouse_hide_timer.start();
     }
 
+    if (!UISettings::values.has_broken_vulkan) {
+        renderer_status_button->setEnabled(!emulation_running);
+    }
+
     UpdateStatusButtons();
     controller_dialog->refreshConfiguration();
 }
diff --git a/src/yuzu/uisettings.h b/src/yuzu/uisettings.h
index 653b768837..c64d87acea 100644
--- a/src/yuzu/uisettings.h
+++ b/src/yuzu/uisettings.h
@@ -77,6 +77,7 @@ struct Values {
     Settings::BasicSetting<bool> pause_when_in_background{false, "pauseWhenInBackground"};
     Settings::BasicSetting<bool> mute_when_in_background{false, "muteWhenInBackground"};
     Settings::BasicSetting<bool> hide_mouse{true, "hideInactiveMouse"};
+    // Set when Vulkan is known to crash the application
     Settings::BasicSetting<bool> has_broken_vulkan{false, "has_broken_vulkan"};
 
     Settings::BasicSetting<bool> select_user_on_boot{false, "select_user_on_boot"};