#vulkan
#vulkan
Вопрос:
В Vulkan, предположим, у меня есть два прохода рендеринга:
- первый выводится на изображение в качестве его цветного вложения.
- вторая выборка из того же изображения из его фрагментных шейдеров (т.Е. Через комбинированный сэмплер изображений).
Проходы рендеринга отправляются в таком порядке.
Каков правильный способ синхронизировать эти два прохода рендеринга, чтобы второй не считывался до записи первого?
Необходимо и / или достаточно создать барьер конвейера изображений на изображении между ними?
Ответ №1:
Необходимо и достаточно иметь барьер памяти изображений между ними:
- Барьер выполнения: необходимо убедиться, что шейдеры второго фрагмента
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
renderpass () не начнут выполняться до завершения записи всего первого цветового вложенияVK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
renderpass (). - Барьер памяти: необходимо убедиться, что записи о прикреплении цвета первого renderpass (
VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT
) доступны и видны для вторых инструкций по выборке изображения renderpass (VK_ACCESS_SHADER_READ_BIT
) . - Переход макета: вам нужно изменить макет изображения с
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL
наVK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL
.
Все это можно сделать в a vkCmdPipelineBarrier
с помощью одного VkImageMemoryBarrier
. Или вы можете использовать a VkSubpassDependency
для одного из двух проходов рендеринга (с dstSubpass
или srcSubpass
установленным значением VK_SUBPASS_EXTERNAL
) и полей и вложения oldLayout
newLayout
.