VulkanDevice.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using System;
  2. using Silk.NET.Vulkan;
  3. namespace Ryujinx.Ava.Ui.Vulkan
  4. {
  5. internal class VulkanDevice : IDisposable
  6. {
  7. private static object _lock = new object();
  8. public VulkanDevice(Device apiHandle, VulkanPhysicalDevice physicalDevice, Vk api)
  9. {
  10. InternalHandle = apiHandle;
  11. Api = api;
  12. api.GetDeviceQueue(apiHandle, physicalDevice.QueueFamilyIndex, 0, out var queue);
  13. Queue = new VulkanQueue(this, queue);
  14. PresentQueue = Queue;
  15. }
  16. public IntPtr Handle => InternalHandle.Handle;
  17. internal Device InternalHandle { get; }
  18. public Vk Api { get; }
  19. public VulkanQueue Queue { get; private set; }
  20. public VulkanQueue PresentQueue { get; }
  21. public void Dispose()
  22. {
  23. WaitIdle();
  24. Queue = null;
  25. Api.DestroyDevice(InternalHandle, Span<AllocationCallbacks>.Empty);
  26. }
  27. internal void Submit(SubmitInfo submitInfo, Fence fence = default)
  28. {
  29. lock (_lock)
  30. {
  31. Api.QueueSubmit(Queue.InternalHandle, 1, submitInfo, fence).ThrowOnError();
  32. }
  33. }
  34. public void WaitIdle()
  35. {
  36. lock (_lock)
  37. {
  38. Api.DeviceWaitIdle(InternalHandle);
  39. }
  40. }
  41. public void QueueWaitIdle()
  42. {
  43. lock (_lock)
  44. {
  45. Api.QueueWaitIdle(Queue.InternalHandle);
  46. }
  47. }
  48. public object Lock => _lock;
  49. }
  50. }