Несколько переходов макета вложения через VkSubpassDependency - PullRequest
1 голос
/ 30 октября 2019

Я пытаюсь выяснить, как использовать VkSubpassDependency для учета нескольких переходов макета вложений (особенно разных типов). Я вижу пример Sascha Willems о том, как использовать маски доступа в зависимости от подпроцесса для создания перехода макета изображения к окончательному макету, но Sascha использует только одно вложение. В моей ситуации у меня есть несколько вложений, одно для цвета, одно для глубины, каждое с различным конечным переходом. Должен ли я просто добавить больше битов маски доступа? из spec похоже, что на самом деле мне нужно было бы создать новую зависимость для субпрохода с помощью сценических масок в другой части конвейера, включающей цвет.

Любая команда синхронизации, которая принимает маски ступеней и маски доступа, использует обе для определения областей доступа - в область доступа включены только указанные типы доступа, выполняемые указанными этапами. Прикладная программа не должна указывать флаг доступа в команде синхронизации, если она не включает стадию конвейера в маску соответствующей стадии, которая может выполнять доступ этого типа.

Я не могу найти никаких примеров этого, и я не вижу нигде обрисованного в общих чертах.

1 Ответ

3 голосов
/ 30 октября 2019

Маски доступа не соответствуют переходам макета. Для проходов рендеринга вы не указываете переходы макета явно для вложений. Вместо этого вы определяете в VkAttachmentReference s, предоставленных для VkSubpassDescription, какой макет должен быть вложением (ями) для этого подпроцесса. Затем система проходов рендеринга отвечает за вставку соответствующих переходов между различными подпроцессами, полностью зависящими от порядка, в котором она выбирает выполнение подпроходов.

Порядок, который, конечно, определяется зависимостями выполнения подпроцесса. Таким образом, цитата из комментария в примере «Использовать зависимости подпрохода для переходов макета» довольно вводит в заблуждение. Это не зависимости подпроцесса, которые вызывают переходы макета;это система рендеринга. Просто зависимости subpass предоставляют ограничения на то, как проход рендеринга может внедрить переход макета.

Теперь эти ограничения имеют значение, потому что, хотя проходы рендеринга более автоматические, Vulkan по-прежнему Vulkan ,Без явных зависимостей между подпроцессами они могут выполняться в любом порядке. Поэтому, если один подпроцесс собирается использовать продукты рендеринга другого, даже если он просто перезаписывает эти продукты рендеринга, между ними все равно должна быть зависимость.

Маски доступа важны, но не для макетапереходы. Они важны для правильной синхронизации ;они важны для обеспечения того, чтобы исходный подпроход сделал правильные операции видимыми для назначения.

Таким образом, если подпропуск 0 выполняет запись в буферы цвета и глубины, а подпроход 1 заботится только о значениях, записанных вбуфер глубины, зависимость между ними должна только сказать, что он получит доступ к записанной информации о глубине (и, конечно, как он планирует ее прочитать).

...