From d7ec4308b45d4ecb8d77cdc8d98ee618944292ed Mon Sep 17 00:00:00 2001
From: Elijah <elitkramer@gmail.com>
Date: Thu, 25 Jan 2024 16:07:20 -0800
Subject: Use driver name instead of vendor name in the status bar for Vulkan.
 (#6146)

* Replace vendor id lookup with driver name

* Create separate field for driver name, handle OpenGL

* Document changes in VulkanPhysicalDevice.cs

* Always display driver over vendor

* Replace Vulkan 1.2 requirement with VK_KHR_driver_properties

* Remove empty line

* Remove redundant unsafe block

* Apply suggestions from code review

---------

Co-authored-by: Ac_K <Acoustik666@gmail.com>
---
 src/Ryujinx.Ava/AppHost.cs                         |  2 +-
 src/Ryujinx.Graphics.GAL/HardwareInfo.cs           |  4 +++-
 src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs      |  2 +-
 .../VulkanPhysicalDevice.cs                        | 27 ++++++++++++++++++++++
 src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs      |  6 ++++-
 src/Ryujinx.Headless.SDL2/WindowBase.cs            | 10 ++++----
 src/Ryujinx/Ui/RendererWidgetBase.cs               | 10 ++++----
 7 files changed, 47 insertions(+), 14 deletions(-)

diff --git a/src/Ryujinx.Ava/AppHost.cs b/src/Ryujinx.Ava/AppHost.cs
index e434deb0..696a4046 100644
--- a/src/Ryujinx.Ava/AppHost.cs
+++ b/src/Ryujinx.Ava/AppHost.cs
@@ -978,7 +978,7 @@ namespace Ryujinx.Ava
                 ConfigurationState.Instance.Graphics.AspectRatio.Value.ToText(),
                 LocaleManager.Instance[LocaleKeys.Game] + $": {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)",
                 $"FIFO: {Device.Statistics.GetFifoPercent():00.00} %",
-                $"GPU: {_renderer.GetHardwareInfo().GpuVendor}"));
+                $"GPU: {_renderer.GetHardwareInfo().GpuDriver}"));
         }
 
         public async Task ShowExitPrompt()
diff --git a/src/Ryujinx.Graphics.GAL/HardwareInfo.cs b/src/Ryujinx.Graphics.GAL/HardwareInfo.cs
index d8f7d1f7..c2546fa4 100644
--- a/src/Ryujinx.Graphics.GAL/HardwareInfo.cs
+++ b/src/Ryujinx.Graphics.GAL/HardwareInfo.cs
@@ -4,11 +4,13 @@ namespace Ryujinx.Graphics.GAL
     {
         public string GpuVendor { get; }
         public string GpuModel { get; }
+        public string GpuDriver { get; }
 
-        public HardwareInfo(string gpuVendor, string gpuModel)
+        public HardwareInfo(string gpuVendor, string gpuModel, string gpuDriver)
         {
             GpuVendor = gpuVendor;
             GpuModel = gpuModel;
+            GpuDriver = gpuDriver;
         }
     }
 }
diff --git a/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs b/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs
index 64ba4e3e..3d774aad 100644
--- a/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs
+++ b/src/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs
@@ -121,7 +121,7 @@ namespace Ryujinx.Graphics.OpenGL
 
         public HardwareInfo GetHardwareInfo()
         {
-            return new HardwareInfo(GpuVendor, GpuRenderer);
+            return new HardwareInfo(GpuVendor, GpuRenderer, GpuVendor); // OpenGL does not provide a driver name, vendor name is closest analogue.
         }
 
         public PinnedSpan<byte> GetBufferData(BufferHandle buffer, int offset, int size)
diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanPhysicalDevice.cs b/src/Ryujinx.Graphics.Vulkan/VulkanPhysicalDevice.cs
index 547f3654..3bee1e9d 100644
--- a/src/Ryujinx.Graphics.Vulkan/VulkanPhysicalDevice.cs
+++ b/src/Ryujinx.Graphics.Vulkan/VulkanPhysicalDevice.cs
@@ -58,6 +58,33 @@ namespace Ryujinx.Graphics.Vulkan
 
         public bool IsDeviceExtensionPresent(string extension) => DeviceExtensions.Contains(extension);
 
+        public unsafe bool TryGetPhysicalDeviceDriverPropertiesKHR(Vk api, out PhysicalDeviceDriverPropertiesKHR res)
+        {
+            if (!IsDeviceExtensionPresent("VK_KHR_driver_properties"))
+            {
+                res = default;
+
+                return false;
+            }
+
+            PhysicalDeviceDriverPropertiesKHR physicalDeviceDriverProperties = new()
+            {
+                SType = StructureType.PhysicalDeviceDriverPropertiesKhr
+            };
+
+            PhysicalDeviceProperties2 physicalDeviceProperties2 = new()
+            {
+                SType = StructureType.PhysicalDeviceProperties2,
+                PNext = &physicalDeviceDriverProperties
+            };
+
+            api.GetPhysicalDeviceProperties2(PhysicalDevice, &physicalDeviceProperties2);
+
+            res = physicalDeviceDriverProperties;
+
+            return true;
+        }
+
         public DeviceInfo ToDeviceInfo()
         {
             return new DeviceInfo(
diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs
index 641ac844..48f05fa1 100644
--- a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs
+++ b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs
@@ -84,6 +84,7 @@ namespace Ryujinx.Graphics.Vulkan
         internal bool IsTBDR { get; private set; }
         internal bool IsSharedMemory { get; private set; }
         public string GpuVendor { get; private set; }
+        public string GpuDriver { get; private set; }
         public string GpuRenderer { get; private set; }
         public string GpuVersion { get; private set; }
 
@@ -636,7 +637,7 @@ namespace Ryujinx.Graphics.Vulkan
 
         public HardwareInfo GetHardwareInfo()
         {
-            return new HardwareInfo(GpuVendor, GpuRenderer);
+            return new HardwareInfo(GpuVendor, GpuRenderer, GpuDriver);
         }
 
         /// <summary>
@@ -693,6 +694,8 @@ namespace Ryujinx.Graphics.Vulkan
         {
             var properties = _physicalDevice.PhysicalDeviceProperties;
 
+            var hasDriverProperties = _physicalDevice.TryGetPhysicalDeviceDriverPropertiesKHR(Api, out var driverProperties);
+
             string vendorName = VendorUtils.GetNameFromId(properties.VendorID);
 
             Vendor = VendorUtils.FromId(properties.VendorID);
@@ -707,6 +710,7 @@ namespace Ryujinx.Graphics.Vulkan
                 Vendor == Vendor.ImgTec;
 
             GpuVendor = vendorName;
+            GpuDriver = hasDriverProperties ? Marshal.PtrToStringAnsi((IntPtr)driverProperties.DriverName) : vendorName; // Fall back to vendor name if driver name isn't available.
             GpuRenderer = Marshal.PtrToStringAnsi((IntPtr)properties.DeviceName);
             GpuVersion = $"Vulkan v{ParseStandardVulkanVersion(properties.ApiVersion)}, Driver v{ParseDriverVersion(ref properties)}";
 
diff --git a/src/Ryujinx.Headless.SDL2/WindowBase.cs b/src/Ryujinx.Headless.SDL2/WindowBase.cs
index 1bfe4312..b1f43dc2 100644
--- a/src/Ryujinx.Headless.SDL2/WindowBase.cs
+++ b/src/Ryujinx.Headless.SDL2/WindowBase.cs
@@ -80,7 +80,7 @@ namespace Ryujinx.Headless.SDL2
         private bool _isStopped;
         private uint _windowId;
 
-        private string _gpuVendorName;
+        private string _gpuDriverName;
 
         private readonly AspectRatio _aspectRatio;
         private readonly bool _enableMouse;
@@ -241,9 +241,9 @@ namespace Ryujinx.Headless.SDL2
 
         public abstract SDL_WindowFlags GetWindowFlags();
 
-        private string GetGpuVendorName()
+        private string GetGpuDriverName()
         {
-            return Renderer.GetHardwareInfo().GpuVendor;
+            return Renderer.GetHardwareInfo().GpuDriver;
         }
 
         private void SetAntiAliasing()
@@ -269,7 +269,7 @@ namespace Ryujinx.Headless.SDL2
 
             SetScalingFilter();
 
-            _gpuVendorName = GetGpuVendorName();
+            _gpuDriverName = GetGpuDriverName();
 
             Device.Gpu.Renderer.RunLoop(() =>
             {
@@ -314,7 +314,7 @@ namespace Ryujinx.Headless.SDL2
                             Device.Configuration.AspectRatio.ToText(),
                             $"Game: {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)",
                             $"FIFO: {Device.Statistics.GetFifoPercent():0.00} %",
-                            $"GPU: {_gpuVendorName}"));
+                            $"GPU: {_gpuDriverName}"));
 
                         _ticks = Math.Min(_ticks - _ticksPerFrame, _ticksPerFrame);
                     }
diff --git a/src/Ryujinx/Ui/RendererWidgetBase.cs b/src/Ryujinx/Ui/RendererWidgetBase.cs
index 7660f190..7794e044 100644
--- a/src/Ryujinx/Ui/RendererWidgetBase.cs
+++ b/src/Ryujinx/Ui/RendererWidgetBase.cs
@@ -77,7 +77,7 @@ namespace Ryujinx.Ui
         private readonly IKeyboard _keyboardInterface;
         private readonly GraphicsDebugLevel _glLogLevel;
         private string _gpuBackendName;
-        private string _gpuVendorName;
+        private string _gpuDriverName;
         private bool _isMouseInClient;
 
         public RendererWidgetBase(InputManager inputManager, GraphicsDebugLevel glLogLevel)
@@ -141,9 +141,9 @@ namespace Ryujinx.Ui
 
         protected abstract string GetGpuBackendName();
 
-        private string GetGpuVendorName()
+        private string GetGpuDriverName()
         {
-            return Renderer.GetHardwareInfo().GpuVendor;
+            return Renderer.GetHardwareInfo().GpuDriver;
         }
 
         private void HideCursorStateChanged(object sender, ReactiveEventArgs<HideCursorMode> state)
@@ -443,7 +443,7 @@ namespace Ryujinx.Ui
             Renderer.Window.SetScalingFilterLevel(ConfigurationState.Instance.Graphics.ScalingFilterLevel.Value);
 
             _gpuBackendName = GetGpuBackendName();
-            _gpuVendorName = GetGpuVendorName();
+            _gpuDriverName = GetGpuDriverName();
 
             Device.Gpu.Renderer.RunLoop(() =>
             {
@@ -494,7 +494,7 @@ namespace Ryujinx.Ui
                             ConfigurationState.Instance.Graphics.AspectRatio.Value.ToText(),
                             $"Game: {Device.Statistics.GetGameFrameRate():00.00} FPS ({Device.Statistics.GetGameFrameTime():00.00} ms)",
                             $"FIFO: {Device.Statistics.GetFifoPercent():0.00} %",
-                            $"GPU: {_gpuVendorName}"));
+                            $"GPU: {_gpuDriverName}"));
 
                         _ticks = Math.Min(_ticks - _ticksPerFrame, _ticksPerFrame);
                     }
-- 
cgit v1.2.3-70-g09d2