aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.OpenGL/Sync.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.OpenGL/Sync.cs')
-rw-r--r--Ryujinx.Graphics.OpenGL/Sync.cs168
1 files changed, 0 insertions, 168 deletions
diff --git a/Ryujinx.Graphics.OpenGL/Sync.cs b/Ryujinx.Graphics.OpenGL/Sync.cs
deleted file mode 100644
index 58818e6a..00000000
--- a/Ryujinx.Graphics.OpenGL/Sync.cs
+++ /dev/null
@@ -1,168 +0,0 @@
-using OpenTK.Graphics.OpenGL;
-using Ryujinx.Common.Logging;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-
-namespace Ryujinx.Graphics.OpenGL
-{
- class Sync : IDisposable
- {
- private class SyncHandle
- {
- public ulong ID;
- public IntPtr Handle;
- }
-
- private ulong _firstHandle = 0;
- private ClientWaitSyncFlags _syncFlags => HwCapabilities.RequiresSyncFlush ? ClientWaitSyncFlags.None : ClientWaitSyncFlags.SyncFlushCommandsBit;
-
- private List<SyncHandle> _handles = new List<SyncHandle>();
-
- public void Create(ulong id)
- {
- SyncHandle handle = new SyncHandle
- {
- ID = id,
- Handle = GL.FenceSync(SyncCondition.SyncGpuCommandsComplete, WaitSyncFlags.None)
- };
-
-
- if (HwCapabilities.RequiresSyncFlush)
- {
- // Force commands to flush up to the syncpoint.
- GL.ClientWaitSync(handle.Handle, ClientWaitSyncFlags.SyncFlushCommandsBit, 0);
- }
-
- lock (_handles)
- {
- _handles.Add(handle);
- }
- }
-
- 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;
-
- lock (_handles)
- {
- if ((long)(_firstHandle - id) > 0)
- {
- return; // The handle has already been signalled or deleted.
- }
-
- foreach (SyncHandle handle in _handles)
- {
- if (handle.ID == id)
- {
- result = handle;
- break;
- }
- }
- }
-
- if (result != null)
- {
- lock (result)
- {
- if (result.Handle == IntPtr.Zero)
- {
- return;
- }
-
- WaitSyncStatus syncResult = GL.ClientWaitSync(result.Handle, _syncFlags, 1000000000);
-
- if (syncResult == WaitSyncStatus.TimeoutExpired)
- {
- Logger.Error?.PrintMsg(LogClass.Gpu, $"GL Sync Object {result.ID} failed to signal within 1000ms. Continuing...");
- }
- }
- }
- }
-
- public void Cleanup()
- {
- // Iterate through handles and remove any that have already been signalled.
-
- while (true)
- {
- SyncHandle first = null;
- lock (_handles)
- {
- first = _handles.FirstOrDefault();
- }
-
- if (first == null) break;
-
- WaitSyncStatus syncResult = GL.ClientWaitSync(first.Handle, _syncFlags, 0);
-
- if (syncResult == WaitSyncStatus.AlreadySignaled)
- {
- // Delete the sync object.
- lock (_handles)
- {
- lock (first)
- {
- _firstHandle = first.ID + 1;
- _handles.RemoveAt(0);
- GL.DeleteSync(first.Handle);
- first.Handle = IntPtr.Zero;
- }
- }
- } else
- {
- // This sync handle and any following have not been reached yet.
- break;
- }
- }
- }
-
- public void Dispose()
- {
- lock (_handles)
- {
- foreach (SyncHandle handle in _handles)
- {
- lock (handle)
- {
- GL.DeleteSync(handle.Handle);
- handle.Handle = IntPtr.Zero;
- }
- }
-
- _handles.Clear();
- }
- }
- }
-}