Командный буфер Vulkan используется после простоя vkDeviceWait

#c #c #vulkan

Вопрос:

Во время инициализации моей программы я хочу использовать несколько буферов команд одного времени для переходов компоновки изображений, построения структуры ускорения и т. Д.

Однако, похоже, я не могу освободить буфер команд, как только он будет завершен.

 VkCommandBuffer AppContext::singleTimeCommandBuffer() const {
    VkCommandBuffer ret;
    auto allocInfo = vks::initializers::commandBufferAllocateInfo(vkCommandPool, VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1);
    vkCheck(vkAllocateCommandBuffers(vkDevice, amp;allocInfo, amp;ret));
    auto beginInfo = vks::initializers::commandBufferBeginInfo();
    beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
    vkCheck(vkBeginCommandBuffer(ret, amp;beginInfo));
    return ret;
}

void AppContext::endSingleTimeCommands(VkCommandBuffer cmdBuffer) const {
    vkCheck(vkEndCommandBuffer(cmdBuffer));
    auto submitInfo = vks::initializers::submitInfo(amp;cmdBuffer);
    vkQueueSubmit(queues.graphics, 1, amp;submitInfo, VK_NULL_HANDLE);

    vkQueueWaitIdle(queues.graphics);
    // Overkill, I know
    vkDeviceWaitIdle(vkDevice);
    vkFreeCommandBuffers(vkDevice, vkCommandPool, 1, amp;cmdBuffer);
}
 

Что приводит к следующей ошибке проверки:

 VUID-vkFreeCommandBuffers-pCommandBuffers-00047(ERROR / SPEC): msgNum: 448332540 - Validation Error: [ VUID-vkFreeCommandBuffers-pCommandBuffers-00047 ] Object 0: handle = 0x5586acaeff78, type = VK_OBJECT_TYPE_COMMAND_BUFFER; | MessageID = 0x1ab902fc | Attempt to free VkCommandBuffer 0x5586acaeff78[] which is in use. The Vulkan spec states: All elements of pCommandBuffers must not be in the pending state (https://vulkan.lunarg.com/doc/view/1.2.182.0/linux/1.2-extensions/vkspec.html#VUID-vkFreeCommandBuffers-pCommandBuffers-00047)
    Objects: 1
        [0] 0x5586acaeff78, type: 6, name: NULL
 

Я не понимаю, как это имеет смысл, поскольку VkQueueWaitIdle, а также vkDeviceWaitIdle должны обеспечивать, чтобы буфер команд не находился в состоянии ожидания. Я неправильно понимаю спецификации Vulkan или, возможно, я наткнулся на ошибку в видеодрайвере или, возможно, на уровне проверки?

Ответ №1:

Вы не проверяете возвращаемые значения vkQueueSubmit(), vkQueueWaitIdle() или vkDeviceWaitIdle(). Кто-нибудь из них терпит неудачу? Это может привести к этой ошибке.

Комментарии:

1. Отличное предложение, вы были правы. Они возвращают VK_ERROR_DEVICE_LOST. Похоже, что я делаю некоторые неопределенные вещи при строительстве ускорительных конструкций. Большое спасибо, я думаю, что это ответ на этот вопрос