ソースを参照

Fix crash in SettingsViewModel when Vulkan isn't available (#4985)

* fix crash when Vulkan isn't available

* add VulkanRenderer.GetPhysicalDevices() overload that provides its own Vk API object and logs on failure

* adjustments per AcK77
jhorv 3 年 前
コミット
ac66643346

+ 1 - 1
src/Ryujinx.Ava/UI/ViewModels/SettingsViewModel.cs

@@ -311,7 +311,7 @@ namespace Ryujinx.Ava.UI.ViewModels
         {
             _gpuIds = new List<string>();
             List<string> names = new();
-            var devices = VulkanRenderer.GetPhysicalDevices(Vk.GetApi());
+            var devices = VulkanRenderer.GetPhysicalDevices();
 
             if (devices.Length == 0)
             {

+ 19 - 0
src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs

@@ -599,6 +599,25 @@ namespace Ryujinx.Graphics.Vulkan
             return new HardwareInfo(GpuVendor, GpuRenderer);
         }
 
+        /// <summary>
+        /// Gets the available Vulkan devices using the default Vulkan API
+        /// object returned by <see cref="Vk.GetApi()"/>
+        /// </summary>
+        /// <returns></returns>
+        public static DeviceInfo[] GetPhysicalDevices()
+        {
+            try
+            {
+                return VulkanInitialization.GetSuitablePhysicalDevices(Vk.GetApi());
+            }
+            catch (Exception ex)
+            {
+                Logger.Error?.PrintMsg(LogClass.Gpu, $"Error querying Vulkan devices: {ex.Message}");
+
+                return Array.Empty<DeviceInfo>();
+            }
+        }
+
         public static DeviceInfo[] GetPhysicalDevices(Vk api)
         {
             try

+ 1 - 1
src/Ryujinx/Ui/Windows/SettingsWindow.cs

@@ -478,7 +478,7 @@ namespace Ryujinx.Ui.Windows
 
             if (Enum.Parse<GraphicsBackend>(_graphicsBackend.ActiveId) == GraphicsBackend.Vulkan)
             {
-                var devices = VulkanRenderer.GetPhysicalDevices(Vk.GetApi());
+                var devices = VulkanRenderer.GetPhysicalDevices();
                 string preferredGpuIdFromConfig = ConfigurationState.Instance.Graphics.PreferredGpu.Value;
                 string preferredGpuId = preferredGpuIdFromConfig;
                 bool noGpuId = string.IsNullOrEmpty(preferredGpuIdFromConfig);