From 5d2ba6d01b74634e92ebac7cb9ec62fcf34df755 Mon Sep 17 00:00:00 2001 From: jp2masa Date: Fri, 7 Jun 2024 21:41:30 +0100 Subject: [PATCH] Implemented VulkanDevice.Dispose. (#15936) --- src/Avalonia.Vulkan/Interop/VulkanDevice.Create.cs | 2 +- src/Avalonia.Vulkan/Interop/VulkanDevice.cs | 14 ++++++++++---- .../UnmanagedInterop/VulkanInstanceApi.cs | 3 +++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Vulkan/Interop/VulkanDevice.Create.cs b/src/Avalonia.Vulkan/Interop/VulkanDevice.Create.cs index dcc48f8634..08d1f637ab 100644 --- a/src/Avalonia.Vulkan/Interop/VulkanDevice.Create.cs +++ b/src/Avalonia.Vulkan/Interop/VulkanDevice.Create.cs @@ -87,7 +87,7 @@ internal unsafe partial class VulkanDevice api.GetDeviceQueue(createdDevice, dev.QueueFamilyIndex, 0, out var createdQueue); - return new VulkanDevice(api.Instance, createdDevice, dev.PhysicalDevice, createdQueue, + return new VulkanDevice(api, createdDevice, dev.PhysicalDevice, createdQueue, dev.QueueFamilyIndex, enabledExtensions); } diff --git a/src/Avalonia.Vulkan/Interop/VulkanDevice.cs b/src/Avalonia.Vulkan/Interop/VulkanDevice.cs index 24d02687bc..a67a629ce2 100644 --- a/src/Avalonia.Vulkan/Interop/VulkanDevice.cs +++ b/src/Avalonia.Vulkan/Interop/VulkanDevice.cs @@ -9,7 +9,8 @@ namespace Avalonia.Vulkan.Interop; internal partial class VulkanDevice : IVulkanDevice { - private readonly VkDevice _handle; + private readonly VulkanInstanceApi _instanceApi; + private VkDevice _handle; private readonly VkPhysicalDevice _physicalDeviceHandle; private readonly VkQueue _mainQueue; private readonly uint _graphicsQueueIndex; @@ -17,14 +18,15 @@ internal partial class VulkanDevice : IVulkanDevice private Thread? _lockedByThread; private int _lockCount; - private VulkanDevice(IVulkanInstance instance, VkDevice handle, VkPhysicalDevice physicalDeviceHandle, + private VulkanDevice(VulkanInstanceApi instanceApi, VkDevice handle, VkPhysicalDevice physicalDeviceHandle, VkQueue mainQueue, uint graphicsQueueIndex, string[] enabledExtensions) { + _instanceApi = instanceApi; _handle = handle; _physicalDeviceHandle = physicalDeviceHandle; _mainQueue = mainQueue; _graphicsQueueIndex = graphicsQueueIndex; - Instance = instance; + Instance = _instanceApi.Instance; EnabledExtensions = enabledExtensions; } @@ -59,7 +61,11 @@ internal partial class VulkanDevice : IVulkanDevice public IVulkanInstance Instance { get; } public void Dispose() { - // TODO + if (_handle.Handle != IntPtr.Zero) + { + _instanceApi.DestroyDevice(_handle, IntPtr.Zero); + _handle = default; + } } public object? TryGetFeature(Type featureType) => null; diff --git a/src/Avalonia.Vulkan/UnmanagedInterop/VulkanInstanceApi.cs b/src/Avalonia.Vulkan/UnmanagedInterop/VulkanInstanceApi.cs index fd8c1d40cd..9a64319b00 100644 --- a/src/Avalonia.Vulkan/UnmanagedInterop/VulkanInstanceApi.cs +++ b/src/Avalonia.Vulkan/UnmanagedInterop/VulkanInstanceApi.cs @@ -46,6 +46,9 @@ internal unsafe partial class VulkanInstanceApi public partial VkResult CreateDevice(VkPhysicalDevice physicalDevice, ref VkDeviceCreateInfo pCreateInfo, IntPtr pAllocator, out VkDevice pDevice); + [GetProcAddress("vkDestroyDevice")] + public partial VkResult DestroyDevice(VkDevice device, IntPtr pAllocator); + [GetProcAddress("vkGetDeviceQueue")] public partial void GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, out VkQueue pQueue);