Синхронизация двух проходов рендеринга: привязка цвета к выборке?

#vulkan

#vulkan

Вопрос:

В Vulkan, предположим, у меня есть два прохода рендеринга:

  1. первый выводится на изображение в качестве его цветного вложения.
  2. вторая выборка из того же изображения из его фрагментных шейдеров (т.Е. Через комбинированный сэмплер изображений).

Проходы рендеринга отправляются в таком порядке.

Каков правильный способ синхронизировать эти два прохода рендеринга, чтобы второй не считывался до записи первого?

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

Ответ №1:

Необходимо и достаточно иметь барьер памяти изображений между ними:

  1. Барьер выполнения: необходимо убедиться, что шейдеры второго фрагмента VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT renderpass () не начнут выполняться до завершения записи всего первого цветового вложения VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT renderpass ().
  2. Барьер памяти: необходимо убедиться, что записи о прикреплении цвета первого renderpass ( VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT ) доступны и видны для вторых инструкций по выборке изображения renderpass ( VK_ACCESS_SHADER_READ_BIT ) .
  3. Переход макета: вам нужно изменить макет изображения с 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 .