diff options
Diffstat (limited to 'Ryujinx.Graphics.Vulkan')
| -rw-r--r-- | Ryujinx.Graphics.Vulkan/SyncManager.cs | 38 | ||||
| -rw-r--r-- | Ryujinx.Graphics.Vulkan/VulkanRenderer.cs | 5 |
2 files changed, 42 insertions, 1 deletions
diff --git a/Ryujinx.Graphics.Vulkan/SyncManager.cs b/Ryujinx.Graphics.Vulkan/SyncManager.cs index a39862d0..35e3adf1 100644 --- a/Ryujinx.Graphics.Vulkan/SyncManager.cs +++ b/Ryujinx.Graphics.Vulkan/SyncManager.cs @@ -11,6 +11,7 @@ namespace Ryujinx.Graphics.Vulkan { public ulong ID; public MultiFenceHolder Waitable; + public bool Signalled; } private ulong _firstHandle = 0; @@ -45,6 +46,37 @@ namespace Ryujinx.Graphics.Vulkan } } + public ulong GetCurrent() + { + lock (_handles) + { + ulong lastHandle = _firstHandle; + + foreach (SyncHandle handle in _handles) + { + lock (handle) + { + if (handle.Waitable == null) + { + continue; + } + + if (handle.ID > lastHandle) + { + bool signaled = handle.Signalled || handle.Waitable.WaitForFences(_gd.Api, _device, 0); + if (signaled) + { + lastHandle = handle.ID; + handle.Signalled = true; + } + } + } + } + + return lastHandle; + } + } + public void Wait(ulong id) { SyncHandle result = null; @@ -75,11 +107,15 @@ namespace Ryujinx.Graphics.Vulkan return; } - bool signaled = result.Waitable.WaitForFences(_gd.Api, _device, 1000000000); + bool signaled = result.Signalled || result.Waitable.WaitForFences(_gd.Api, _device, 1000000000); if (!signaled) { Logger.Error?.PrintMsg(LogClass.Gpu, $"VK Sync Object {result.ID} failed to signal within 1000ms. Continuing..."); } + else + { + result.Signalled = true; + } } } } diff --git a/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs b/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs index 22e30329..5acbe841 100644 --- a/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs +++ b/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs @@ -565,6 +565,11 @@ namespace Ryujinx.Graphics.Vulkan _syncManager.Wait(id); } + public ulong GetCurrentSync() + { + return _syncManager.GetCurrent(); + } + public void Screenshot() { _window.ScreenCaptureRequested = true; |
