Vulkan: синхронизация вложений с неявными переходами макета
Я прочитал почти все, что Google дал мне в этой теме и не смог прийти к удовлетворительному выводу. По сути, это следующий вопрос:
Перемещение макетов изображений с барьером или проходами рендеринга
Предположим, у меня есть цветное вложение, которое записывается в одном проходе рендеринга и отбирается во втором. Пусть в обоих проходах рендеринга будет только один подпроход. Одним из способов обработки перехода и зависимостей макета является добавление барьера между двумя проходами рендеринга, который меняет макет с VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL на VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL.
Но Vulkan также предлагает неявные переходы макета (vkAttachmentDescription, initialLayout и finalLayout). Я предполагаю, что их использование дает преимущество в производительности, поэтому давайте просто попробуем избавиться от нашего барьера. Мы устанавливаем поля initialLayout и finalLayout в структуре vkAttachmentDescription и удаляем барьер. Проблема в том, что мы потеряли синхронизацию, обеспечиваемую барьером, поэтому нам нужно вернуть синхронизацию другими способами. И вот тут начинается путаница, которая приводит к моим вопросам:
1) Каков рекомендуемый способ синхронизации вложения между двумя проходами рендеринга? Очевидно, что я мог бы просто добавить барьер заново, а не менять макет, но разве это не противоречит цели всего упражнения, а именно: повысить производительность, используя неявные переходы макета и избавившись от барьера? Или я должен добавить зависимость подпроцесса от одного подпрохода прохода рендеринга 1 до VK_SUBPASS_EXTERNAL? Есть ли какие-либо предостережения от использования VK_SUBPASS_EXTERNAL в отношении производительности?
2) Как насчет синхронизации вложения в обратном направлении? Приложение отвечает за перевод приложения в правильное начальное расположение, что, очевидно, может быть выполнено с помощью барьера. Можно ли заменить этот барьер, чтобы получить преимущество в производительности? Единственный способ, о котором я могу думать, - это сделать часть зависимости с зависимостью подпроцесса от VK_SUBPASS_EXTERNAL до одного подпрохода прохода рендеринга 1 и использовать "быстрый" барьер (тот, который не синхронизируется), который выполняет только изменение макета. Имеет ли это смысл? Как будет выглядеть этот барьер? Или "полный" барьер в этом случае неизбежен?
Краткая версия моих вопросов проста: как другие люди выполняют синхронизацию вложений в сочетании с неявными переходами макета?
2 ответа
Вообще говоря, когда Vulkan или подобные низкоуровневые API-интерфейсы предлагают вам несколько инструментов, которые могут достичь того, что вы хотите, вы должны отдать предпочтение наиболее конкретному инструменту, который может решить вашу проблему (без необходимости радикальной перестройки кода или существенного влияния на ваш дизайн).
В вашем случае у вас есть 2 варианта: барьеры или механизмы прохода рендеринга (зависимости подпрохода и переходы макета). Барьеры работают с чем угодно; им все равно, откуда исходит изображение, для чего оно используется или куда оно идет. Механизмы прохода рендеринга работают только с вещами, которые происходят в проходе рендеринга, и в основном имеют дело с изображениями, прикрепленными к проходам рендеринга (неявные переходы макета работают только с вложениями)
Механизмы рендеринга более специфичны, поэтому вы должны использовать эти инструменты, если они соответствуют вашим потребностям.
Именно поэтому, если у вас есть две "отдельные" операции рендеринга, которые могут быть в одном проходе рендеринга (если вы читаете из вложения способом, который может соответствовать ограничениям входных вложения), вы должны предпочесть поставить их в том же рендере проход.
Краткая версия моих вопросов проста: как другие люди выполняют синхронизацию вложений в сочетании с неявными переходами макета?
Визуализация проходных зависимостей - это то, что вы ищете. В случае двух проходов рендеринга Вам необходимо использовать упомянутые VK_SUBPASS_EXTERNAL
значение.
Приложение отвечает за перевод приложения в правильное начальное расположение, что, очевидно, может быть выполнено с помощью барьера. Можно ли заменить этот барьер, чтобы получить преимущество в производительности?
Однако вы выполняете переход макета, это не имеет значения. Вы несете ответственность за перенос макета изображения на тот, который указан в качестве исходного макета. Но я думаю, что лучшим способом было бы снова использовать неявные переходы макета, предоставляемые проходами рендеринга. Если вы уже используете их, должна быть возможность настроить их таким образом, чтобы при первом проходе рендеринга изображение переходило в макет, который совпадает с исходным макетом второго прохода рендеринга и окончательным макетом второго рендера. pass такой же, как и исходный макет первого прохода рендера.