Конечно, вам практически всегда нужно синхронизироваться в Vulkan. Лишь очень немногие места, где Вулкан выполняет неявную синхронизацию.
У вас неверная интуиция относительно этапов конвейера. Команды самостоятельно «доходят» до этапов конвейера. Все команды начинаются с VK_PIPELINE_STAGE_TOP_OF_PIPE
(они «достигают» его в порядке подачи). Затем (без синхронизации) не определено, какие команды будут переходить на следующую стадию конвейера. Там нет порядка для этого без явной синхронизации примитивов. В спецификации говорилось бы что-то вроде «выполнение операций очереди может перекрываться или происходить не по порядку».
Так что без синхронизации vkCmdCopyQueryPoolResults
может произойти даже до vkCmdFillBuffer
, что, я полагаю, вам не нужно. Если они оба происходят одновременно, это еще хуже. Данные могут затем содержать некоторый беспорядок записей из обоих источников (или ни из одного). Результаты будут просто неопределенными.