aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Gpu/Synchronization/Syncpoint.cs
diff options
context:
space:
mode:
authorTSR Berry <20988865+TSRBerry@users.noreply.github.com>2023-04-08 01:22:00 +0200
committerMary <thog@protonmail.com>2023-04-27 23:51:14 +0200
commitcee712105850ac3385cd0091a923438167433f9f (patch)
tree4a5274b21d8b7f938c0d0ce18736d3f2993b11b1 /Ryujinx.Graphics.Gpu/Synchronization/Syncpoint.cs
parentcd124bda587ef09668a971fa1cac1c3f0cfc9f21 (diff)
Move solution and projects to src
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Synchronization/Syncpoint.cs')
-rw-r--r--Ryujinx.Graphics.Gpu/Synchronization/Syncpoint.cs128
1 files changed, 0 insertions, 128 deletions
diff --git a/Ryujinx.Graphics.Gpu/Synchronization/Syncpoint.cs b/Ryujinx.Graphics.Gpu/Synchronization/Syncpoint.cs
deleted file mode 100644
index 39fb83c0..00000000
--- a/Ryujinx.Graphics.Gpu/Synchronization/Syncpoint.cs
+++ /dev/null
@@ -1,128 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Threading;
-
-namespace Ryujinx.Graphics.Gpu.Synchronization
-{
- /// <summary>
- /// Represents GPU hardware syncpoint.
- /// </summary>
- class Syncpoint
- {
- private int _storedValue;
-
- public readonly uint Id;
-
- /// <summary>
- /// The value of the syncpoint.
- /// </summary>
- public uint Value => (uint)_storedValue;
-
- // TODO: switch to something handling concurrency?
- private readonly List<SyncpointWaiterHandle> _waiters;
-
- public Syncpoint(uint id)
- {
- Id = id;
- _waiters = new List<SyncpointWaiterHandle>();
- }
-
- /// <summary>
- /// Register a new callback for a target threshold.
- /// The callback will be called once the threshold is reached and will automatically be unregistered.
- /// </summary>
- /// <param name="threshold">The target threshold</param>
- /// <param name="callback">The callback to call when the threshold is reached</param>
- /// <returns>The created SyncpointWaiterHandle object or null if already past threshold</returns>
- public SyncpointWaiterHandle RegisterCallback(uint threshold, Action<SyncpointWaiterHandle> callback)
- {
- lock (_waiters)
- {
- if (Value >= threshold)
- {
- callback(null);
-
- return null;
- }
- else
- {
- SyncpointWaiterHandle waiterInformation = new SyncpointWaiterHandle
- {
- Threshold = threshold,
- Callback = callback
- };
-
- _waiters.Add(waiterInformation);
-
- return waiterInformation;
- }
- }
- }
-
- public void UnregisterCallback(SyncpointWaiterHandle waiterInformation)
- {
- lock (_waiters)
- {
- _waiters.Remove(waiterInformation);
- }
- }
-
- /// <summary>
- /// Increment the syncpoint
- /// </summary>
- /// <returns>The incremented value of the syncpoint</returns>
- public uint Increment()
- {
- uint currentValue = (uint)Interlocked.Increment(ref _storedValue);
-
- SyncpointWaiterHandle expired = null;
- List<SyncpointWaiterHandle> expiredList = null;
-
- lock (_waiters)
- {
- _waiters.RemoveAll(item =>
- {
- bool isPastThreshold = currentValue >= item.Threshold;
-
- if (isPastThreshold)
- {
- if (expired == null)
- {
- expired = item;
- }
- else
- {
- if (expiredList == null)
- {
- expiredList = new List<SyncpointWaiterHandle>();
- }
-
- expiredList.Add(item);
- }
- }
-
- return isPastThreshold;
- });
- }
-
- // Call the callbacks as a separate step.
- // As we don't know what the callback will be doing,
- // and it could block execution for a indefinite amount of time,
- // we can't call it inside the lock.
- if (expired != null)
- {
- expired.Callback(expired);
-
- if (expiredList != null)
- {
- for (int i = 0; i < expiredList.Count; i++)
- {
- expiredList[i].Callback(expiredList[i]);
- }
- }
- }
-
- return currentValue;
- }
- }
-}