SemaphoreHolder.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using Silk.NET.Vulkan;
  2. using System;
  3. using System.Threading;
  4. using VkSemaphore = Silk.NET.Vulkan.Semaphore;
  5. namespace Ryujinx.Graphics.Vulkan
  6. {
  7. class SemaphoreHolder : IDisposable
  8. {
  9. private readonly Vk _api;
  10. private readonly Device _device;
  11. private VkSemaphore _semaphore;
  12. private int _referenceCount;
  13. public bool _disposed;
  14. public unsafe SemaphoreHolder(Vk api, Device device)
  15. {
  16. _api = api;
  17. _device = device;
  18. var semaphoreCreateInfo = new SemaphoreCreateInfo()
  19. {
  20. SType = StructureType.SemaphoreCreateInfo
  21. };
  22. api.CreateSemaphore(device, in semaphoreCreateInfo, null, out _semaphore).ThrowOnError();
  23. _referenceCount = 1;
  24. }
  25. public VkSemaphore GetUnsafe()
  26. {
  27. return _semaphore;
  28. }
  29. public VkSemaphore Get()
  30. {
  31. Interlocked.Increment(ref _referenceCount);
  32. return _semaphore;
  33. }
  34. public unsafe void Put()
  35. {
  36. if (Interlocked.Decrement(ref _referenceCount) == 0)
  37. {
  38. _api.DestroySemaphore(_device, _semaphore, null);
  39. _semaphore = default;
  40. }
  41. }
  42. public void Dispose()
  43. {
  44. if (!_disposed)
  45. {
  46. Put();
  47. _disposed = true;
  48. }
  49. }
  50. }
  51. }