From 9480e5c5ceeac3219dc0e0a90c0cb2a5487a7298 Mon Sep 17 00:00:00 2001
From: Isaac Marovitz <42140194+IsaacMarovitz@users.noreply.github.com>
Date: Wed, 10 Apr 2024 22:40:17 +0100
Subject: [PATCH] Ava UI: Prevent Status Bar Backend Update (#6506)

* Prevent Status Bar Backend Update

* Make it a switch
---
 src/Ryujinx/AppHost.cs                         | 18 +++++++++++++++---
 src/Ryujinx/UI/Models/StatusInitEventArgs.cs   | 16 ++++++++++++++++
 .../UI/Models/StatusUpdatedEventArgs.cs        |  6 +-----
 .../UI/ViewModels/MainWindowViewModel.cs       | 15 +++++++++++++--
 4 files changed, 45 insertions(+), 10 deletions(-)
 create mode 100644 src/Ryujinx/UI/Models/StatusInitEventArgs.cs

diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs
index d69bfc147f..43e7a79ebb 100644
--- a/src/Ryujinx/AppHost.cs
+++ b/src/Ryujinx/AppHost.cs
@@ -112,6 +112,7 @@ namespace Ryujinx.Ava
         private readonly object _lockObject = new();
 
         public event EventHandler AppExit;
+        public event EventHandler<StatusInitEventArgs> StatusInitEvent;
         public event EventHandler<StatusUpdatedEventArgs> StatusUpdatedEvent;
 
         public VirtualFileSystem VirtualFileSystem { get; }
@@ -947,6 +948,7 @@ namespace Ryujinx.Ava
                         {
                             _renderingStarted = true;
                             _viewModel.SwitchToRenderer(false);
+                            InitStatus();
                         }
 
                         Device.PresentFrame(() => (RendererHost.EmbeddedWindow as EmbeddedWindowOpenGL)?.SwapBuffers());
@@ -970,6 +972,18 @@ namespace Ryujinx.Ava
             (RendererHost.EmbeddedWindow as EmbeddedWindowOpenGL)?.MakeCurrent(true);
         }
 
+        public void InitStatus()
+        {
+            StatusInitEvent?.Invoke(this, new StatusInitEventArgs(
+                ConfigurationState.Instance.Graphics.GraphicsBackend.Value switch
+                {
+                    GraphicsBackend.Vulkan => "Vulkan",
+                    GraphicsBackend.OpenGl => "OpenGL",
+                    _ => throw new NotImplementedException()
+                },
+                $"GPU: {_renderer.GetHardwareInfo().GpuDriver}"));
+        }
+
         public void UpdateStatus()
         {
             // Run a status update only when a frame is to be drawn. This prevents from updating the ui and wasting a render when no frame is queued.
@@ -983,12 +997,10 @@ namespace Ryujinx.Ava
             StatusUpdatedEvent?.Invoke(this, new StatusUpdatedEventArgs(
                 Device.EnableDeviceVsync,
                 LocaleManager.Instance[LocaleKeys.VolumeShort] + $": {(int)(Device.GetVolume() * 100)}%",
-                ConfigurationState.Instance.Graphics.GraphicsBackend.Value == GraphicsBackend.Vulkan ? "Vulkan" : "OpenGL",
                 dockedMode,
                 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().GpuDriver}"));
+                $"FIFO: {Device.Statistics.GetFifoPercent():00.00} %"));
         }
 
         public async Task ShowExitPrompt()
diff --git a/src/Ryujinx/UI/Models/StatusInitEventArgs.cs b/src/Ryujinx/UI/Models/StatusInitEventArgs.cs
new file mode 100644
index 0000000000..4b08737e96
--- /dev/null
+++ b/src/Ryujinx/UI/Models/StatusInitEventArgs.cs
@@ -0,0 +1,16 @@
+using System;
+
+namespace Ryujinx.Ava.UI.Models
+{
+    internal class StatusInitEventArgs : EventArgs
+    {
+        public string GpuBackend { get; }
+        public string GpuName { get; }
+
+        public StatusInitEventArgs(string gpuBackend, string gpuName)
+        {
+            GpuBackend = gpuBackend;
+            GpuName = gpuName;
+        }
+    }
+}
diff --git a/src/Ryujinx/UI/Models/StatusUpdatedEventArgs.cs b/src/Ryujinx/UI/Models/StatusUpdatedEventArgs.cs
index 7f04c0eed9..ee5648faf8 100644
--- a/src/Ryujinx/UI/Models/StatusUpdatedEventArgs.cs
+++ b/src/Ryujinx/UI/Models/StatusUpdatedEventArgs.cs
@@ -6,23 +6,19 @@ namespace Ryujinx.Ava.UI.Models
     {
         public bool VSyncEnabled { get; }
         public string VolumeStatus { get; }
-        public string GpuBackend { get; }
         public string AspectRatio { get; }
         public string DockedMode { get; }
         public string FifoStatus { get; }
         public string GameStatus { get; }
-        public string GpuName { get; }
 
-        public StatusUpdatedEventArgs(bool vSyncEnabled, string volumeStatus, string gpuBackend, string dockedMode, string aspectRatio, string gameStatus, string fifoStatus, string gpuName)
+        public StatusUpdatedEventArgs(bool vSyncEnabled, string volumeStatus, string dockedMode, string aspectRatio, string gameStatus, string fifoStatus)
         {
             VSyncEnabled = vSyncEnabled;
             VolumeStatus = volumeStatus;
-            GpuBackend = gpuBackend;
             DockedMode = dockedMode;
             AspectRatio = aspectRatio;
             GameStatus = gameStatus;
             FifoStatus = fifoStatus;
-            GpuName = gpuName;
         }
     }
 }
diff --git a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
index 036a536e5c..130e708c77 100644
--- a/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
+++ b/src/Ryujinx/UI/ViewModels/MainWindowViewModel.cs
@@ -1172,6 +1172,7 @@ namespace Ryujinx.Ava.UI.ViewModels
         {
             RendererHostControl.WindowCreated += RendererHost_Created;
 
+            AppHost.StatusInitEvent += Init_StatusBar;
             AppHost.StatusUpdatedEvent += Update_StatusBar;
             AppHost.AppExit += AppHost_AppExit;
 
@@ -1198,6 +1199,18 @@ namespace Ryujinx.Ava.UI.ViewModels
             }
         }
 
+        private void Init_StatusBar(object sender, StatusInitEventArgs args)
+        {
+            if (ShowMenuAndStatusBar && !ShowLoadProgress)
+            {
+                Dispatcher.UIThread.InvokeAsync(() =>
+                {
+                    GpuNameText = args.GpuName;
+                    BackendText = args.GpuBackend;
+                });
+            }
+        }
+
         private void Update_StatusBar(object sender, StatusUpdatedEventArgs args)
         {
             if (ShowMenuAndStatusBar && !ShowLoadProgress)
@@ -1220,8 +1233,6 @@ namespace Ryujinx.Ava.UI.ViewModels
                     GameStatusText = args.GameStatus;
                     VolumeStatusText = args.VolumeStatus;
                     FifoStatusText = args.FifoStatus;
-                    GpuNameText = args.GpuName;
-                    BackendText = args.GpuBackend;
 
                     ShowStatusSeparator = true;
                 });