Для перехода ресурсов вам нужно знать «до» и «после» VkImageLayout
ресурса (например, в VkImageMemoryBarrier
перешел к vkCmdPipelineBarrier
). Vulkan не гарантирует какой-либо порядок выполнения командных буферов, если это явно не указано в документации API (от этот ответ). Тем не мение, vkCmdPipelineBarrier
явно говорит, что создает зависимость между командами в буфере команд до и после вызова. Таким образом, можно «узнать» расположение изображения в любой момент, когда оно перемещается в пределах одного буфера команд.
Тем не мение, vkQueueSumbit
не обеспечивает порядок выполнения командных буферов. Если есть два буфера команд, каждый с vkCmdPipelineBarrier
вызывает переход одного и того же изображения в разные макеты, есть ли зависимость между этими двумя операциями или требуется явная синхронизация в этой ситуации?
Раздел 2.2.1 говорит:
Границы буфера команд, как между первичными буферами команд одинаковых или разных пакетов или представлений, так и между первичными и вторичными буферами команд, не вводят каких-либо неявных ограничений порядка. Другими словами, отправка набора буферов команд (который может включать выполнение вторичных буферов команд) между любыми операциями семафора или ограждения воспроизводит записанные команды, как если бы они все были записаны в один первичный буфер команд, за исключением того, что текущее состояние сбросить на каждой границе.
В разделе 6.4 говорится, что пары команд для синхронизации включают в себя:
Первый набор: команды перед барьером конвейера.
Второй набор: команды после этого конвейерного барьера в той же очереди (возможно, в пределах одного и того же подпроцесса).
Обратите внимание, что он говорит «в той же очереди», а не «в том же буфере команд».
Оба эти утверждения проясняют, что конвейерные барьеры влияют на выполнение команд в очереди. Зависимости выполнения не ограничиваются командами буфера одной команды.
Других решений пока нет …