aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Profiler/UI/ProfileWindowManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Profiler/UI/ProfileWindowManager.cs')
-rw-r--r--Ryujinx.Profiler/UI/ProfileWindowManager.cs90
1 files changed, 90 insertions, 0 deletions
diff --git a/Ryujinx.Profiler/UI/ProfileWindowManager.cs b/Ryujinx.Profiler/UI/ProfileWindowManager.cs
new file mode 100644
index 00000000..4ba0c881
--- /dev/null
+++ b/Ryujinx.Profiler/UI/ProfileWindowManager.cs
@@ -0,0 +1,90 @@
+using System.Diagnostics;
+using System.Threading;
+using OpenTK;
+using OpenTK.Input;
+using Ryujinx.Common;
+
+namespace Ryujinx.Profiler.UI
+{
+ public class ProfileWindowManager
+ {
+ private ProfileWindow _window;
+ private Thread _profileThread;
+ private Thread _renderThread;
+ private bool _profilerRunning;
+
+ // Timing
+ private double _prevTime;
+
+ public ProfileWindowManager()
+ {
+ if (Profile.ProfilingEnabled())
+ {
+ _profilerRunning = true;
+ _prevTime = 0;
+ _profileThread = new Thread(ProfileLoop);
+ _profileThread.Start();
+ }
+ }
+
+ public void ToggleVisible()
+ {
+ if (Profile.ProfilingEnabled())
+ {
+ _window.ToggleVisible();
+ }
+ }
+
+ public void Close()
+ {
+ if (_window != null)
+ {
+ _profilerRunning = false;
+ _window.Close();
+ _window.Dispose();
+ }
+
+ _window = null;
+ }
+
+ public void UpdateKeyInput(KeyboardState keyboard)
+ {
+ if (Profile.Controls.TogglePressed(keyboard))
+ {
+ ToggleVisible();
+ }
+ Profile.Controls.SetPrevKeyboardState(keyboard);
+ }
+
+ private void ProfileLoop()
+ {
+ using (_window = new ProfileWindow())
+ {
+ // Create thread for render loop
+ _renderThread = new Thread(RenderLoop);
+ _renderThread.Start();
+
+ while (_profilerRunning)
+ {
+ double time = (double)PerformanceCounter.ElapsedTicks / PerformanceCounter.TicksPerSecond;
+ _window.Update(new FrameEventArgs(time - _prevTime));
+ _prevTime = time;
+
+ // Sleep to be less taxing, update usually does very little
+ Thread.Sleep(1);
+ }
+ }
+ }
+
+ private void RenderLoop()
+ {
+ _window.Context.MakeCurrent(_window.WindowInfo);
+
+ while (_profilerRunning)
+ {
+ _window.Draw();
+ Thread.Sleep(1);
+ }
+ }
+ }
+}