Browse Source

Implemented VulkanDevice.Dispose. (#15936)

pull/15952/head
jp2masa 2 years ago
committed by GitHub
parent
commit
5d2ba6d01b
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 2
      src/Avalonia.Vulkan/Interop/VulkanDevice.Create.cs
  2. 14
      src/Avalonia.Vulkan/Interop/VulkanDevice.cs
  3. 3
      src/Avalonia.Vulkan/UnmanagedInterop/VulkanInstanceApi.cs

2
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); 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); dev.QueueFamilyIndex, enabledExtensions);
} }

14
src/Avalonia.Vulkan/Interop/VulkanDevice.cs

@ -9,7 +9,8 @@ namespace Avalonia.Vulkan.Interop;
internal partial class VulkanDevice : IVulkanDevice internal partial class VulkanDevice : IVulkanDevice
{ {
private readonly VkDevice _handle; private readonly VulkanInstanceApi _instanceApi;
private VkDevice _handle;
private readonly VkPhysicalDevice _physicalDeviceHandle; private readonly VkPhysicalDevice _physicalDeviceHandle;
private readonly VkQueue _mainQueue; private readonly VkQueue _mainQueue;
private readonly uint _graphicsQueueIndex; private readonly uint _graphicsQueueIndex;
@ -17,14 +18,15 @@ internal partial class VulkanDevice : IVulkanDevice
private Thread? _lockedByThread; private Thread? _lockedByThread;
private int _lockCount; 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) VkQueue mainQueue, uint graphicsQueueIndex, string[] enabledExtensions)
{ {
_instanceApi = instanceApi;
_handle = handle; _handle = handle;
_physicalDeviceHandle = physicalDeviceHandle; _physicalDeviceHandle = physicalDeviceHandle;
_mainQueue = mainQueue; _mainQueue = mainQueue;
_graphicsQueueIndex = graphicsQueueIndex; _graphicsQueueIndex = graphicsQueueIndex;
Instance = instance; Instance = _instanceApi.Instance;
EnabledExtensions = enabledExtensions; EnabledExtensions = enabledExtensions;
} }
@ -59,7 +61,11 @@ internal partial class VulkanDevice : IVulkanDevice
public IVulkanInstance Instance { get; } public IVulkanInstance Instance { get; }
public void Dispose() public void Dispose()
{ {
// TODO if (_handle.Handle != IntPtr.Zero)
{
_instanceApi.DestroyDevice(_handle, IntPtr.Zero);
_handle = default;
}
} }
public object? TryGetFeature(Type featureType) => null; public object? TryGetFeature(Type featureType) => null;

3
src/Avalonia.Vulkan/UnmanagedInterop/VulkanInstanceApi.cs

@ -46,6 +46,9 @@ internal unsafe partial class VulkanInstanceApi
public partial VkResult CreateDevice(VkPhysicalDevice physicalDevice, ref VkDeviceCreateInfo pCreateInfo, public partial VkResult CreateDevice(VkPhysicalDevice physicalDevice, ref VkDeviceCreateInfo pCreateInfo,
IntPtr pAllocator, out VkDevice pDevice); IntPtr pAllocator, out VkDevice pDevice);
[GetProcAddress("vkDestroyDevice")]
public partial VkResult DestroyDevice(VkDevice device, IntPtr pAllocator);
[GetProcAddress("vkGetDeviceQueue")] [GetProcAddress("vkGetDeviceQueue")]
public partial void GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex, public partial void GetDeviceQueue(VkDevice device, uint32_t queueFamilyIndex, uint32_t queueIndex,
out VkQueue pQueue); out VkQueue pQueue);

Loading…
Cancel
Save