aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.OpenGL
diff options
context:
space:
mode:
authorriperiperi <rhy3756547@hotmail.com>2022-12-01 15:30:13 +0000
committerGitHub <noreply@github.com>2022-12-01 16:30:13 +0100
commit458452279cee03bfe1bbf2c3daf3fc9722b03a74 (patch)
treed62389dca124f75f2245d03d288ff54b87b7269e /Ryujinx.Graphics.OpenGL
parent817b89767aa31b3b2847203b27151044f5d323f6 (diff)
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
Diffstat (limited to 'Ryujinx.Graphics.OpenGL')
-rw-r--r--Ryujinx.Graphics.OpenGL/OpenGLRenderer.cs5
-rw-r--r--Ryujinx.Graphics.OpenGL/Sync.cs31
2 files changed, 36 insertions, 0 deletions
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;