aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Vulkan/SemaphoreHolder.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Ryujinx.Graphics.Vulkan/SemaphoreHolder.cs')
-rw-r--r--Ryujinx.Graphics.Vulkan/SemaphoreHolder.cs60
1 files changed, 60 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.Vulkan/SemaphoreHolder.cs b/Ryujinx.Graphics.Vulkan/SemaphoreHolder.cs
new file mode 100644
index 00000000..aa1b0eaf
--- /dev/null
+++ b/Ryujinx.Graphics.Vulkan/SemaphoreHolder.cs
@@ -0,0 +1,60 @@
+using Silk.NET.Vulkan;
+using System;
+using System.Threading;
+using VkSemaphore = Silk.NET.Vulkan.Semaphore;
+
+namespace Ryujinx.Graphics.Vulkan
+{
+ class SemaphoreHolder : IDisposable
+ {
+ private readonly Vk _api;
+ private readonly Device _device;
+ private VkSemaphore _semaphore;
+ private int _referenceCount;
+ public bool _disposed;
+
+ public unsafe SemaphoreHolder(Vk api, Device device)
+ {
+ _api = api;
+ _device = device;
+
+ var semaphoreCreateInfo = new SemaphoreCreateInfo()
+ {
+ SType = StructureType.SemaphoreCreateInfo
+ };
+
+ api.CreateSemaphore(device, in semaphoreCreateInfo, null, out _semaphore).ThrowOnError();
+
+ _referenceCount = 1;
+ }
+
+ public VkSemaphore GetUnsafe()
+ {
+ return _semaphore;
+ }
+
+ public VkSemaphore Get()
+ {
+ Interlocked.Increment(ref _referenceCount);
+ return _semaphore;
+ }
+
+ public unsafe void Put()
+ {
+ if (Interlocked.Decrement(ref _referenceCount) == 0)
+ {
+ _api.DestroySemaphore(_device, _semaphore, null);
+ _semaphore = default;
+ }
+ }
+
+ public void Dispose()
+ {
+ if (!_disposed)
+ {
+ Put();
+ _disposed = true;
+ }
+ }
+ }
+}