From 458452279cee03bfe1bbf2c3daf3fc9722b03a74 Mon Sep 17 00:00:00 2001 From: riperiperi Date: Thu, 1 Dec 2022 15:30:13 +0000 Subject: GPU: Track buffer migrations and flush source on incomplete copy (#3952) * Track buffer migrations and flush source on incomplete copy Makes sure that the modified range list is always from the latest iteration of the buffer, and flushes earlier iterations of a buffer if the data has not been migrated yet. * Cleanup 1 * Reduce cost for redundant signal checks on Vulkan * Only inherit the range list if there are pending ranges. * Fix OpenGL * Address Feedback * Whoops --- Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs | 5 +++++ Ryujinx.Graphics.OpenGL/Sync.cs | 31 +++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+) (limited to 'Ryujinx.Graphics.OpenGL') diff --git a/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs b/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs index e26fe6b6..63c96fa2 100644 --- a/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs +++ b/Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs @@ -238,6 +238,11 @@ namespace Ryujinx.Graphics.OpenGL _sync.Wait(id); } + public ulong GetCurrentSync() + { + return _sync.GetCurrent(); + } + public void Screenshot() { _window.ScreenCaptureRequested = true; diff --git a/Ryujinx.Graphics.OpenGL/Sync.cs b/Ryujinx.Graphics.OpenGL/Sync.cs index de94fd31..58818e6a 100644 --- a/Ryujinx.Graphics.OpenGL/Sync.cs +++ b/Ryujinx.Graphics.OpenGL/Sync.cs @@ -40,6 +40,37 @@ namespace Ryujinx.Graphics.OpenGL } } + public ulong GetCurrent() + { + lock (_handles) + { + ulong lastHandle = _firstHandle; + + foreach (SyncHandle handle in _handles) + { + lock (handle) + { + if (handle.Handle == IntPtr.Zero) + { + continue; + } + + if (handle.ID > lastHandle) + { + WaitSyncStatus syncResult = GL.ClientWaitSync(handle.Handle, _syncFlags, 0); + + if (syncResult == WaitSyncStatus.AlreadySignaled) + { + lastHandle = handle.ID; + } + } + } + } + + return lastHandle; + } + } + public void Wait(ulong id) { SyncHandle result = null; -- cgit v1.2.3