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{};
|
VkCommandPoolCreateInfo poolInfo{};
|
||||||
poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
poolInfo.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
||||||
poolInfo.queueFamilyIndex = m_graphicsFamilyQueueIndex;
|
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) {
|
if (vkCreateCommandPool(m_logicalDevice, &poolInfo, nullptr, &m_graphicsCommandPool) != VK_SUCCESS) {
|
||||||
return false;
|
return false;
|
||||||
@@ -640,19 +640,17 @@ KrResult KRDevice::selectPresentMode(VkSurfaceKHR& surface, VkPresentModeKHR& se
|
|||||||
return KR_SUCCESS;
|
return KR_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void KRDevice::streamStart()
|
void KRDevice::streamStart()
|
||||||
{
|
{
|
||||||
VkCommandBufferBeginInfo beginInfo{};
|
if (!m_streamingStagingBuffer.started) {
|
||||||
beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
|
VkCommandBufferBeginInfo beginInfo{};
|
||||||
beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
|
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
|
m_streamingStagingBuffer.started = true;
|
||||||
{
|
}
|
||||||
return m_streamingStagingBuffer.size - m_streamingStagingBuffer.usage;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void KRDevice::streamUpload(KRDataBlock& data, VkBuffer destination)
|
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()
|
void KRDevice::streamEnd()
|
||||||
{
|
{
|
||||||
|
if (m_streamingStagingBuffer.usage == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
vkEndCommandBuffer(m_transferCommandBuffers[0]);
|
vkEndCommandBuffer(m_transferCommandBuffers[0]);
|
||||||
|
|
||||||
if (m_streamingStagingBuffer.usage > 0) {
|
if (m_streamingStagingBuffer.usage > 0) {
|
||||||
@@ -795,4 +796,6 @@ void KRDevice::streamEnd()
|
|||||||
|
|
||||||
vkQueueSubmit(m_transferQueue, 1, &submitInfo, VK_NULL_HANDLE);
|
vkQueueSubmit(m_transferQueue, 1, &submitInfo, VK_NULL_HANDLE);
|
||||||
vkQueueWaitIdle(m_transferQueue);
|
vkQueueWaitIdle(m_transferQueue);
|
||||||
|
|
||||||
|
m_streamingStagingBuffer.started = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,7 +66,6 @@ public:
|
|||||||
KrResult selectPresentMode(VkSurfaceKHR& surface, VkPresentModeKHR& selectedPresentMode);
|
KrResult selectPresentMode(VkSurfaceKHR& surface, VkPresentModeKHR& selectedPresentMode);
|
||||||
|
|
||||||
void streamStart();
|
void streamStart();
|
||||||
size_t streamRemaining() const;
|
|
||||||
void streamUpload(KRDataBlock& data, VkBuffer destination);
|
void streamUpload(KRDataBlock& data, VkBuffer destination);
|
||||||
void streamUpload(void *data, size_t size, VkBuffer destination);
|
void streamUpload(void *data, size_t size, VkBuffer destination);
|
||||||
void streamUpload(void* data, size_t size, Vector2i dimensions, VkImage destination);
|
void streamUpload(void* data, size_t size, Vector2i dimensions, VkImage destination);
|
||||||
@@ -96,6 +95,7 @@ public:
|
|||||||
size_t size;
|
size_t size;
|
||||||
size_t usage;
|
size_t usage;
|
||||||
void* data;
|
void* data;
|
||||||
|
bool started;
|
||||||
|
|
||||||
void destroy(VmaAllocator& allocator);
|
void destroy(VmaAllocator& allocator);
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user