From d1553fc1bf6cbb0d081852ec94dbcad0df065f45 Mon Sep 17 00:00:00 2001 From: kearwood Date: Wed, 20 Jul 2022 23:17:06 -0700 Subject: [PATCH] No longer creating empty command buffers for asynchronous asset streaming when there is no activity. Added VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT to command pools to correct validation errors. --- kraken/KRDevice.cpp | 23 +++++++++++++---------- kraken/KRDevice.h | 2 +- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/kraken/KRDevice.cpp b/kraken/KRDevice.cpp index 4bf76dc..b739d7a 100644 --- a/kraken/KRDevice.cpp +++ b/kraken/KRDevice.cpp @@ -286,7 +286,7 @@ bool KRDevice::initCommandPools() VkCommandPoolCreateInfo poolInfo{}; poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; poolInfo.queueFamilyIndex = m_graphicsFamilyQueueIndex; - poolInfo.flags = 0; + poolInfo.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; if (vkCreateCommandPool(m_logicalDevice, &poolInfo, nullptr, &m_graphicsCommandPool) != VK_SUCCESS) { return false; @@ -640,19 +640,17 @@ KrResult KRDevice::selectPresentMode(VkSurfaceKHR& surface, VkPresentModeKHR& se return KR_SUCCESS; } - void KRDevice::streamStart() { - VkCommandBufferBeginInfo beginInfo{}; - beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; - beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; + if (!m_streamingStagingBuffer.started) { + VkCommandBufferBeginInfo beginInfo{}; + beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; + beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; - vkBeginCommandBuffer(m_transferCommandBuffers[0], &beginInfo); -} + vkBeginCommandBuffer(m_transferCommandBuffers[0], &beginInfo); -size_t KRDevice::streamRemaining() const -{ - return m_streamingStagingBuffer.size - m_streamingStagingBuffer.usage; + m_streamingStagingBuffer.started = true; + } } void KRDevice::streamUpload(KRDataBlock& data, VkBuffer destination) @@ -779,6 +777,9 @@ void KRDevice::streamUpload(void* data, size_t size, Vector2i dimensions, VkImag void KRDevice::streamEnd() { + if (m_streamingStagingBuffer.usage == 0) { + return; + } vkEndCommandBuffer(m_transferCommandBuffers[0]); if (m_streamingStagingBuffer.usage > 0) { @@ -795,4 +796,6 @@ void KRDevice::streamEnd() vkQueueSubmit(m_transferQueue, 1, &submitInfo, VK_NULL_HANDLE); vkQueueWaitIdle(m_transferQueue); + + m_streamingStagingBuffer.started = false; } diff --git a/kraken/KRDevice.h b/kraken/KRDevice.h index 9684259..79d92e3 100644 --- a/kraken/KRDevice.h +++ b/kraken/KRDevice.h @@ -66,7 +66,6 @@ public: KrResult selectPresentMode(VkSurfaceKHR& surface, VkPresentModeKHR& selectedPresentMode); void streamStart(); - size_t streamRemaining() const; void streamUpload(KRDataBlock& data, VkBuffer destination); void streamUpload(void *data, size_t size, VkBuffer destination); void streamUpload(void* data, size_t size, Vector2i dimensions, VkImage destination); @@ -96,6 +95,7 @@ public: size_t size; size_t usage; void* data; + bool started; void destroy(VmaAllocator& allocator); };