VulkanSemaphorePair.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. using System;
  2. using Silk.NET.Vulkan;
  3. using Silk.NET.Vulkan.Extensions.KHR;
  4. using SilkNetDemo;
  5. namespace GpuInterop.VulkanDemo;
  6. class VulkanSemaphorePair : IDisposable
  7. {
  8. private readonly VulkanContext _resources;
  9. public unsafe VulkanSemaphorePair(VulkanContext resources, bool exportable)
  10. {
  11. _resources = resources;
  12. var semaphoreExportInfo = new ExportSemaphoreCreateInfo
  13. {
  14. SType = StructureType.ExportSemaphoreCreateInfo,
  15. HandleTypes = ExternalSemaphoreHandleTypeFlags.OpaqueFDBit
  16. };
  17. var semaphoreCreateInfo = new SemaphoreCreateInfo
  18. {
  19. SType = StructureType.SemaphoreCreateInfo,
  20. PNext = exportable ? &semaphoreExportInfo : null
  21. };
  22. resources.Api.CreateSemaphore(resources.Device, semaphoreCreateInfo, null, out var semaphore).ThrowOnError();
  23. ImageAvailableSemaphore = semaphore;
  24. resources.Api.CreateSemaphore(resources.Device, semaphoreCreateInfo, null, out semaphore).ThrowOnError();
  25. RenderFinishedSemaphore = semaphore;
  26. }
  27. public int ExportFd(bool renderFinished)
  28. {
  29. if (!_resources.Api.TryGetDeviceExtension<KhrExternalSemaphoreFd>(_resources.Instance, _resources.Device,
  30. out var ext))
  31. throw new InvalidOperationException();
  32. var info = new SemaphoreGetFdInfoKHR()
  33. {
  34. SType = StructureType.SemaphoreGetFDInfoKhr,
  35. Semaphore = renderFinished ? RenderFinishedSemaphore : ImageAvailableSemaphore,
  36. HandleType = ExternalSemaphoreHandleTypeFlags.OpaqueFDBit
  37. };
  38. ext.GetSemaphoreF(_resources.Device, info, out var fd).ThrowOnError();
  39. return fd;
  40. }
  41. internal Semaphore ImageAvailableSemaphore { get; }
  42. internal Semaphore RenderFinishedSemaphore { get; }
  43. public unsafe void Dispose()
  44. {
  45. _resources.Api.DestroySemaphore(_resources.Device, ImageAvailableSemaphore, null);
  46. _resources.Api.DestroySemaphore(_resources.Device, RenderFinishedSemaphore, null);
  47. }
  48. }