diff --git a/src/Avalonia.Vulkan/Interop/VulkanCommandBufferPool.cs b/src/Avalonia.Vulkan/Interop/VulkanCommandBufferPool.cs index 02ec0bb6ae..d2c2ab7727 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 @@ internal class VulkanCommandBufferPool : IDisposable 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 d8d9a4cb48..2b31a7311e 100644 --- a/src/Avalonia.Vulkan/VulkanExternalObjectsFeature.cs +++ b/src/Avalonia.Vulkan/VulkanExternalObjectsFeature.cs @@ -92,7 +92,7 @@ internal unsafe class VulkanExternalObjectsFeature : IVulkanContextExternalObjec 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 @@ internal unsafe class VulkanExternalObjectsFeature : IVulkanContextExternalObjec public IVulkanExternalImage ImportImage(IPlatformHandle handle, PlatformGraphicsExternalImageProperties properties) { - _pool.FreeFinishedCommandBuffers(); if (!SupportedImageHandleTypes.Contains(handle.HandleDescriptor)) throw new NotSupportedException(); - return new ImportedImage(_context, _pool, handle, properties); }