aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Graphics.Vulkan/FenceHolder.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 /src/Ryujinx.Graphics.Vulkan/FenceHolder.cs
parentcd124bda587ef09668a971fa1cac1c3f0cfc9f21 (diff)
Move solution and projects to src
Diffstat (limited to 'src/Ryujinx.Graphics.Vulkan/FenceHolder.cs')
-rw-r--r--src/Ryujinx.Graphics.Vulkan/FenceHolder.cs79
1 files changed, 79 insertions, 0 deletions
diff --git a/src/Ryujinx.Graphics.Vulkan/FenceHolder.cs b/src/Ryujinx.Graphics.Vulkan/FenceHolder.cs
new file mode 100644
index 00000000..1c1e6240
--- /dev/null
+++ b/src/Ryujinx.Graphics.Vulkan/FenceHolder.cs
@@ -0,0 +1,79 @@
+using Silk.NET.Vulkan;
+using System;
+using System.Threading;
+
+namespace Ryujinx.Graphics.Vulkan
+{
+ class FenceHolder : IDisposable
+ {
+ private readonly Vk _api;
+ private readonly Device _device;
+ private Fence _fence;
+ private int _referenceCount;
+ private bool _disposed;
+
+ public unsafe FenceHolder(Vk api, Device device)
+ {
+ _api = api;
+ _device = device;
+
+ var fenceCreateInfo = new FenceCreateInfo()
+ {
+ SType = StructureType.FenceCreateInfo
+ };
+
+ api.CreateFence(device, in fenceCreateInfo, null, out _fence).ThrowOnError();
+
+ _referenceCount = 1;
+ }
+
+ public Fence GetUnsafe()
+ {
+ return _fence;
+ }
+
+ public Fence Get()
+ {
+ Interlocked.Increment(ref _referenceCount);
+ return _fence;
+ }
+
+ public void Put()
+ {
+ if (Interlocked.Decrement(ref _referenceCount) == 0)
+ {
+ _api.DestroyFence(_device, _fence, Span<AllocationCallbacks>.Empty);
+ _fence = default;
+ }
+ }
+
+ public void Wait()
+ {
+ Span<Fence> fences = stackalloc Fence[]
+ {
+ _fence
+ };
+
+ FenceHelper.WaitAllIndefinitely(_api, _device, fences);
+ }
+
+ public bool IsSignaled()
+ {
+ Span<Fence> fences = stackalloc Fence[]
+ {
+ _fence
+ };
+
+ return FenceHelper.AllSignaled(_api, _device, fences);
+ }
+
+ public void Dispose()
+ {
+ if (!_disposed)
+ {
+ Put();
+ _disposed = true;
+ }
+ }
+ }
+}