diff --git a/Directory.Packages.props b/Directory.Packages.props
index 4466f2777..3d39156b5 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -3,11 +3,11 @@
true
-
+
-
-
-
+
+
+
diff --git a/src/Ryujinx.Graphics.Vulkan/Auto.cs b/src/Ryujinx.Graphics.Vulkan/Auto.cs
index 9c8c7ff4b..d97d69ad3 100644
--- a/src/Ryujinx.Graphics.Vulkan/Auto.cs
+++ b/src/Ryujinx.Graphics.Vulkan/Auto.cs
@@ -176,9 +176,7 @@ namespace Ryujinx.Graphics.Vulkan
}
}
}
-
- // This can somehow become -1.
- // Logger.Info?.PrintMsg(LogClass.Gpu, $"_referenceCount: {_referenceCount}");
+
Debug.Assert(_referenceCount >= 0);
}
diff --git a/src/Ryujinx/Systems/AppHost.cs b/src/Ryujinx/Systems/AppHost.cs
index 962728f79..90f8b6fc4 100644
--- a/src/Ryujinx/Systems/AppHost.cs
+++ b/src/Ryujinx/Systems/AppHost.cs
@@ -623,15 +623,15 @@ namespace Ryujinx.Ava.Systems
// If the GPU has no work and is cancelled, we need to handle that as well.
WaitHandle.WaitAny(new[] { _gpuDoneEvent, _gpuCancellationTokenSource.Token.WaitHandle });
- _gpuCancellationTokenSource.Dispose();
-
- // Waiting for work to be finished before we dispose.
+
if (_renderingStarted)
{
+ // Waiting for work to be finished before we dispose.
Device.Gpu.WaitUntilGpuReady();
}
_gpuDoneEvent.Dispose();
+ _gpuCancellationTokenSource.Dispose();
DisposeGpu();
AppExit?.Invoke(this, EventArgs.Empty);
@@ -1100,51 +1100,56 @@ namespace Ryujinx.Ava.Systems
Device.Gpu.Renderer.RunLoop(() =>
{
- Device.Gpu.SetGpuThread();
- Device.Gpu.InitializeShaderCache(_gpuCancellationTokenSource.Token);
-
- _renderer.Window.ChangeVSyncMode(Device.VSyncMode);
-
- while (_isActive)
+ try
{
- _ticks += _chrono.ElapsedTicks;
+ Device.Gpu.SetGpuThread();
+ Device.Gpu.InitializeShaderCache(_gpuCancellationTokenSource.Token);
- _chrono.Restart();
+ _renderer.Window.ChangeVSyncMode(Device.VSyncMode);
- if (Device.WaitFifo())
+ while (_isActive)
{
- Device.Statistics.RecordFifoStart();
- Device.ProcessFrame();
- Device.Statistics.RecordFifoEnd();
- }
+ _ticks += _chrono.ElapsedTicks;
- while (Device.ConsumeFrameAvailable())
- {
- if (!_renderingStarted)
+ _chrono.Restart();
+
+ if (Device.WaitFifo())
{
- _renderingStarted = true;
- _viewModel.SwitchToRenderer(false);
- InitStatus();
+ Device.Statistics.RecordFifoStart();
+ Device.ProcessFrame();
+ Device.Statistics.RecordFifoEnd();
}
- Device.PresentFrame(() => (RendererHost.EmbeddedWindow as EmbeddedWindowOpenGL)?.SwapBuffers());
- }
+ while (Device.ConsumeFrameAvailable())
+ {
+ if (!_renderingStarted)
+ {
+ _renderingStarted = true;
+ _viewModel.SwitchToRenderer(false);
+ InitStatus();
+ }
- if (_ticks >= _ticksPerFrame)
- {
- UpdateStatus();
+ Device.PresentFrame(() =>
+ (RendererHost.EmbeddedWindow as EmbeddedWindowOpenGL)?.SwapBuffers());
+ }
+
+ if (_ticks >= _ticksPerFrame)
+ {
+ UpdateStatus();
+ }
}
}
-
- // Make sure all commands in the run loop are fully executed before leaving the loop.
- if (Device.Gpu.Renderer is ThreadedRenderer threaded)
+ finally
{
- Logger.Info?.PrintMsg(LogClass.Gpu, "Flushing threaded commands...");
- threaded.FlushThreadedCommands();
- Logger.Info?.PrintMsg(LogClass.Gpu, "Flushed!");
+ // Make sure all commands in the run loop are fully executed before leaving the loop.
+ if (Device.Gpu.Renderer is ThreadedRenderer threaded)
+ {
+ Logger.Info?.PrintMsg(LogClass.Gpu, "Flushing threaded commands...");
+ threaded.FlushThreadedCommands();
+ Logger.Info?.PrintMsg(LogClass.Gpu, "Flushed!");
+ }
+ _gpuDoneEvent.Set();
}
-
- _gpuDoneEvent.Set();
});
(RendererHost.EmbeddedWindow as EmbeddedWindowOpenGL)?.MakeCurrent(true);