From a1ce176f2254ba4c604a8cb489d5a4bea4dd0848 Mon Sep 17 00:00:00 2001 From: Eric Mellino Date: Fri, 13 Apr 2018 00:21:36 -0700 Subject: [PATCH] [Vulkan] Improve how shared VkCommandPools are recycled. --- src/Veldrid/Vk/VkGraphicsDevice.cs | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/src/Veldrid/Vk/VkGraphicsDevice.cs b/src/Veldrid/Vk/VkGraphicsDevice.cs index 913ff8777..243ae5baa 100644 --- a/src/Veldrid/Vk/VkGraphicsDevice.cs +++ b/src/Veldrid/Vk/VkGraphicsDevice.cs @@ -247,7 +247,6 @@ private void CheckSubmittedFences() { if (sharedPool.IsCached) { - sharedPool.Reset(); _sharedGraphicsCommandPools.Push(sharedPool); } else @@ -1203,6 +1202,8 @@ private class SharedCommandPool { private readonly VkGraphicsDevice _gd; private readonly VkCommandPool _pool; + private readonly VkCommandBuffer _cb; + public bool IsCached { get; } public SharedCommandPool(VkGraphicsDevice gd, bool isCached) @@ -1211,27 +1212,27 @@ public SharedCommandPool(VkGraphicsDevice gd, bool isCached) IsCached = isCached; VkCommandPoolCreateInfo commandPoolCI = VkCommandPoolCreateInfo.New(); - commandPoolCI.flags = VkCommandPoolCreateFlags.Transient; + commandPoolCI.flags = VkCommandPoolCreateFlags.Transient | VkCommandPoolCreateFlags.ResetCommandBuffer; commandPoolCI.queueFamilyIndex = _gd.GraphicsQueueIndex; VkResult result = vkCreateCommandPool(_gd.Device, ref commandPoolCI, null, out _pool); CheckResult(result); - } - public VkCommandBuffer BeginNewCommandBuffer() - { VkCommandBufferAllocateInfo allocateInfo = VkCommandBufferAllocateInfo.New(); allocateInfo.commandBufferCount = 1; allocateInfo.level = VkCommandBufferLevel.Primary; allocateInfo.commandPool = _pool; - VkResult result = vkAllocateCommandBuffers(_gd.Device, ref allocateInfo, out VkCommandBuffer cb); + result = vkAllocateCommandBuffers(_gd.Device, ref allocateInfo, out _cb); CheckResult(result); + } + public VkCommandBuffer BeginNewCommandBuffer() + { VkCommandBufferBeginInfo beginInfo = VkCommandBufferBeginInfo.New(); beginInfo.flags = VkCommandBufferUsageFlags.OneTimeSubmit; - result = vkBeginCommandBuffer(cb, ref beginInfo); + VkResult result = vkBeginCommandBuffer(_cb, ref beginInfo); CheckResult(result); - return cb; + return _cb; } public void EndAndSubmit(VkCommandBuffer cb) @@ -1245,12 +1246,6 @@ public void EndAndSubmit(VkCommandBuffer cb) } } - public void Reset() - { - VkResult result = vkResetCommandPool(_gd.Device, _pool, VkCommandPoolResetFlags.None); - CheckResult(result); - } - internal void Destroy() { vkDestroyCommandPool(_gd.Device, _pool, null);