在我的程式的初始化程序中,我想使用一些單次命令緩沖區來進行影像布局轉換和加速結構構建等。
但是,我似乎無法在命令緩沖區完成后將其釋放。
VkCommandBuffer AppContext::singleTimeCommandBuffer() const{
VkCommandBuffer ret;
auto allocInfo = vks::initializers::commandBufferAllocateInfo(vkCommandPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1) 。
vkCheck(vkAllocateCommandBuffers(vkDevice, & allocInfo, &ret))。
auto beginInfo = vks::initializers::commandBufferBeginInfo()。
beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT。
vkCheck(vkBeginCommandBuffer(ret, & beginInfo))。
return ret。
}
void AppContext::endSingleTimeCommands(VkCommandBuffer cmdBuffer) const {
vkCheck(vkEndCommandBuffer(cmdBuffer))。
auto submitInfo = vks::initializers::submitInfo(&cmdBuffer)。
vkQueueSubmit(queues.graphics, 1, & submitInfo, VK_NULL_HANDLE);
vkQueueWaitIdle(queues.graphics)。
//overkill, I know[/span].
vkDeviceWaitIdle(vkDevice)。
vkFreeCommandBuffers(vkDevice, vkCommandPool, 1, &cmdBuffer)。
這就產生了以下的驗證錯誤:
VUID-vkFreeCommandBuffers-pCommandBuffers-00047(ERROR / SPEC): msgNum: 448332540 - 驗證Error: [ VUID-vkFreeCommandBuffers-pCommandBuffers-00047 ] Object 0: handle = 0x5586acaeff78, type = VK_OBJECT_TYPE_COMMAND_BUFFER; | 訊息ID = 0x1ab902fc | 嘗試to free VkCommandBuffer 0x1ab902fc number">0x5586acaeff78[] which is in use. Vulkan規范指出。所有元素的pCommandBuffers必須不是在未決狀態(https://vulkan.lunarg. com/doc/view/1.2.182. 0/linux/1.2-extensions/vkspec.html#VUID-vkFreeCommandBuffers-pCommandBuffers-00047)
物件。1
[0] 0x5586acaeff78, type: 6, name: NULL: NULL.
我不明白這有什么意義,因為VkQueueWaitIdle以及vkDeviceWaitIdle應該確保命令緩沖區不處于待定狀態。我是否誤解了Vulkan規范,或者我可能在視頻驅動或驗證層中偶然發現了一個錯誤?
uj5u.com熱心網友回復:
你沒有檢查vkQueueSubmit()、vkQueueWaitIdle()或vkDeviceWaitIdle()的回傳值。它們中是否有任何一個失敗了?這可能導致這個錯誤。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/321868.html
標籤:
上一篇:攤銷分析是否僅適用于資料結構?
