From 9ad2ad61d88f1d240ba220f9678fb642be40fb03 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 17 Dec 2024 18:25:36 +0500 Subject: [PATCH] Auto free finished vulkan command buffers in gpu interop feature implementation (#17782) --- src/Avalonia.Vulkan/Interop/VulkanCommandBufferPool.cs | 7 ++++++- src/Avalonia.Vulkan/VulkanExternalObjectsFeature.cs | 4 +--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Avalonia.Vulkan/Interop/VulkanCommandBufferPool.cs b/src/Avalonia.Vulkan/Interop/VulkanCommandBufferPool.cs index 02ec0bb6aef..d2c2ab7727b 100644 --- a/src/Avalonia.Vulkan/Interop/VulkanCommandBufferPool.cs +++ b/src/Avalonia.Vulkan/Interop/VulkanCommandBufferPool.cs @@ -7,13 +7,15 @@ namespace Avalonia.Vulkan.Interop; internal class VulkanCommandBufferPool : IDisposable { private readonly IVulkanPlatformGraphicsContext _context; + private readonly bool _autoFree; private readonly Queue _commandBuffers = new(); private VkCommandPool _handle; public VkCommandPool Handle => _handle; - public VulkanCommandBufferPool(IVulkanPlatformGraphicsContext context) + public VulkanCommandBufferPool(IVulkanPlatformGraphicsContext context, bool autoFree = false) { _context = context; + _autoFree = autoFree; var createInfo = new VkCommandPoolCreateInfo { sType = VkStructureType.VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, @@ -53,6 +55,9 @@ public void Dispose() public unsafe VulkanCommandBuffer CreateCommandBuffer() { + if (_autoFree) + FreeFinishedCommandBuffers(); + var commandBufferAllocateInfo = new VkCommandBufferAllocateInfo { sType = VkStructureType.VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, diff --git a/src/Avalonia.Vulkan/VulkanExternalObjectsFeature.cs b/src/Avalonia.Vulkan/VulkanExternalObjectsFeature.cs index d8d9a4cb482..2b31a7311e5 100644 --- a/src/Avalonia.Vulkan/VulkanExternalObjectsFeature.cs +++ b/src/Avalonia.Vulkan/VulkanExternalObjectsFeature.cs @@ -92,7 +92,7 @@ public VulkanExternalObjectsFeature(VulkanContext context) var uuid = new Span(physicalDeviceIDProperties.deviceUUID, 16).ToArray(); if (uuid.Any(b => b != 0)) DeviceUuid = uuid; - _pool = new VulkanCommandBufferPool(_context); + _pool = new VulkanCommandBufferPool(_context, true); } public IReadOnlyList SupportedImageHandleTypes { get; } @@ -111,10 +111,8 @@ public CompositionGpuImportedImageSynchronizationCapabilities GetSynchronization public IVulkanExternalImage ImportImage(IPlatformHandle handle, PlatformGraphicsExternalImageProperties properties) { - _pool.FreeFinishedCommandBuffers(); if (!SupportedImageHandleTypes.Contains(handle.HandleDescriptor)) throw new NotSupportedException(); - return new ImportedImage(_context, _pool, handle, properties); }