Ответ 1
Первый командный буфер - это объект рендеринга с включенным тестом на глубину. Второй командный буфер - это рендеринг контуров сеток с выключенным тестом глубины. Потому что он должен быть поверх других объектов.
В этом случае то, что вам нужно, зависит от того, что эти буферы команд.
Если это вторичные буферы команд, выполненные в одном экземпляре представления передачи, вам не нужна синхронизация. Нет, если вы вручную не читаете текстуру глубины во вспомогательном буфере команд. Почему?
Поскольку раздел 2.2.1 Заказ API защищает вас. Глубокое тестирование и запись глубины в экземпляре render-pass всегда будут выполняться в порядке API. Поэтому более поздние команды, будь то в одном CB или другом, будут упорядочены в отношении тестирования/записи глубины.
Однако, если вам нужно прочитать этот буфер глубины или ваши буферы команд находятся в разных экземплярах передачи визуализации, вам нужна явная синхронизация через событие.
В этом случае маска сцены для команды vkCmdSetEvent
должна быть этапом, записывающим значение глубины. Это может быть EARLY_FRAGMENT_TESTS_BIT
или LATE_FRAGMENT_TESTS_BIT
. Чтобы быть в безопасности, используйте оба варианта. Однако, поскольку вы, вероятно, обновляете один и тот же колоритный буфер, вам также нужен этап COLOR_ATTACHMENT_OUTPUT_BIT
. Вставьте эту команду в конец первого командного буфера (или после завершения записи глубины).
Для vkCmdWaitEvent
вы хотите подождать на этапах конвейера, которые в этом нуждаются. В вашем случае это опять-таки тесты фрагмента и привязка цвета. Но если этап шейдера будет читать глубину, вам также понадобится эта команда в команде wait.
Так как память задействована, ваш vkCmdWaitEvent
также должен будет использовать зависимость памяти от буферов глубины и цвета.
Действительно, вся эта сложность заключается в том, почему вы должны попытаться поместить эти командные буферы в один и тот же экземпляр передачи, если это вообще возможно. Единственная причина, по которой вы не смогли бы это сделать, - это прочитать вам буфер глубины в шейдере.