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.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user