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);