Конвейерные барьеры между командами переноса и записи - PullRequest
2 голосов
/ 10 марта 2019

У нас есть две команды передачи, vkCmdFillBuffer(), за которыми следует vkCmdCopyQueryPoolResults(). Команды передачи записывают в перекрывающиеся диапазоны буфера.

Необходим ли конвейерный барьер между командами, чтобы избежать опасности записи после записи?

Предоставляет ли Vulkan какие-либо гарантии для команд, выполняемых на одной и той же стадии конвейера?

1 Ответ

3 голосов
/ 10 марта 2019

Конечно, вам практически всегда нужно синхронизироваться в Vulkan. Лишь очень немногие места, где Вулкан выполняет неявную синхронизацию.

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

Так что без синхронизации vkCmdCopyQueryPoolResults может произойти даже до vkCmdFillBuffer, что, я полагаю, вам не нужно. Если они оба происходят одновременно, это еще хуже. Данные могут затем содержать некоторый беспорядок записей из обоих источников (или ни из одного). Результаты будут просто неопределенными.

...