Существует несколько способов обработки синхронизации в Vulkan. Вот как я это понимаю:Синхронизация между буферами команд в Vulkan
- Заборы - это графические процессоры для синхронизации процессора.
- Семафоры являются графическими процессорами GPU, они используются для синхронизации очередей представлений (в тех же или разных очередях).
- События более общие, сбрасываются и проверяются как на процессоре, так и на графическом процессоре.
- Барьеры используются для синхронизации внутри командного буфера.
В моем случае у меня есть два командных буфера. И я хочу, чтобы второй буфер команды выполнялся после первого.
submitInfo.pCommandBuffers = &firstCommandBuffer;
vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
// wait for first command buffer to finish
submitInfo.pCommandBuffers = &secondCommandBuffer;
vkQueueSubmit(queue, 1, &submitInfo, VK_NULL_HANDLE);
Какая синхронизация лучше всего подходит для этого? Если я использую vkQueueWaitIdle(queue)),
, это то же самое, что использовать забор, или я должен использовать для этого события или семафоры?
Если я пошлю несколько commandbuffer в очереди в то же время:
std::vector<VkCommandBuffer> submitCmdBuffers = {
firstCommandBuffer,
secondCommandBuffer
};
submitInfo.commandBufferCount = submitCmdBuffers.size();
submitInfo.pCommandBuffers = submitCmdBuffers.data();
Есть еще способ синхронизации между первой и второй?
«* И я хочу, чтобы второй командный буфер выполнялся после первого. *« Сколько вы «хотите», чтобы это произошло? То есть, что является вторым буфером команд, так что это так важно, чтобы первый выполнил * завершенное выполнение до начала второго? –
Первый буфер команд - это объект рендеринга с включенным тестом глубины. Второй командный буфер - это рендеринг контуров сеток с выключенным тестом глубины. Потому что он должен быть поверх других объектов. – hidayat
Если вы делаете одно представление. затем используйте vkCmdSetEvent в своем первом командном буфере и vkCmdWaitEvents во второй и сохраните маски src и dst, насколько это возможно. –