I go немного больше этого значения в krOoze / Hello_Triangle / do c. Что должно произойти в этом сценарии:
В частности, я не могу найти, как интерпретировать эту "зависимость от той же стадии к себе ".
Теперь, давайте сначала позаботимся об этой проблеме. Это то, что я люблю называть интуитивно понятной системой синхронизации .
Вы делаете , а не"синхронизировать этапы" или что-то в этом роде. Это интуиция, которая только вызовет у вас замешательство. Вы синхронизируете области.
Люди также путают конвейер с блок-схемой. Существует огромная разница в интуиции. В блок-схеме вы начинаете с начала, затем вы go проходите все этапы по порядку, затем вы закончите и навсегда закончите. Это , а не , что такое конвейер. Это никогда не начинается и никогда не заканчивается. Трубопровод просто есть. Это как настольная игровая доска. Вы набираете команды через конвейер, а они go через этапы, похожие на колышки на плате.
Команда синхронизации - это нечто, что вводит зависимость между двумя вещами: между исходная область синхронизации и конечная область синхронизации . Это гарантирует, что область sr c происходит до области dst.
A scope является некоторым подмножеством операций с очередями, и на какой стадии они в данный момент могут выполнять их выполнение.
Итак, с этой лучшей интуицией,
.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
- совершенно нормальная вещь. Это означает, что команды в исходной области (для барьера, команды, записанные ранее, или, более формально, те, «ранее в порядке отправки») достигли этапа COLOR_ATTACHMENT
, прежде чем какие-либо команды в области назначения достигли этапа COLOR_ATTACHMENT
. (Напротив, без зависимости это означало бы, что любая команда может находиться на любой стадии ее выполнения в любой момент времени.)
Например, когда (согласно спецификации ) операция доступности происходит.
Они несколько вставлены в зависимость, которую определяет барьер. Предполагая, что вы включили в свой барьер зависимость от памяти .
Операция доступности (если есть) происходит после области синхронизации источника. Затем происходит переход макета (если есть). Затем происходит операция видимости (если есть). И только после этого может выполняться область синхронизации источника.
Может ли кто-нибудь предоставить мне соответствующие разделы в спецификации, которые объединяют гарантию (составляют цепочку рассуждений)
Я просто хочу похлопать вас по голове за то, что вам нужна авторитетная информация ...: D
Итак, вам нужно знать формализм и номенклатуру. Это то, с чем описаны все примитивы синхронизации. Это только одна страница, но относительно трудно читать. Я попытался объяснить важные части выше. Я не буду здесь это цитировать, это 6.1. Зависимости исполнения и памяти глава.
Теперь у семафора есть своя глава. Важно отметить, что он ведет себя немного иначе для других команд, чем для vkQueueSubmit
(что раздражает). В любом случае ( 6.4.2. Ожидание семафора ):
Вторая область синхронизации включает в себя все команды, представленные в одном пакете. В случае vkQueueSubmit
вторая область синхронизации ограничена операциями на этапах конвейера, определенных маской этапа назначения , определенной соответствующим элементом pWaitDstStageMask
. Кроме того, в случае vkQueueSubmit
вторая область синхронизации дополнительно включает все команды, которые происходят позже в порядке отправки .
Вторая область доступа включает всю память доступ, осуществляемый устройством.
Пакет (для vkQueueSubmit
) - единственный VkSubmitInfo
. Порядок подачи также имеет свою главу; в основном это означает «все другие Пакеты, которые находятся позже в массиве отправки, а также любое будущее vkQueueSubmit
в той же очереди».
Итак, это означает: «если вы ждете семафор, все команды в VkSubmitInfo
могут достигнуть стадии pWaitDstStageMask
только после того, как семафор был сигнализирован ".
Теперь важно понять, что делает Pass Render Pass. Помимо записанных команд у него есть и другие «синхронизируемые»: автоматические c переходы макета, операции загрузки и операции сохранения.
автоматический c переход макета:
Автоматическая c компоновка переходов от initialLayout
происходит после операций доступности для всех зависимостей с srcSubpass, равным VK_SUBPASS_EXTERNAL
, где dstSubpass использует вложение, которое будет переходить
Автоматическая c компоновка переходов в компоновку, используемую в подпроцессе, происходит до операций видимости для всех зависимостей с этим подпропуском как dstSubpass
.
Так Проще говоря, переход макета находится внутри зависимости, которую определяет список VkSubpassDependency
. Это происходит после .srcStageMask
с .srcAccessMask
. И это происходит до .dstSubpass
и .dstStageMask
с .dstAccessMask
.
Операция загрузки:
Операция загрузки для каждого семпла во вложении происходит - до того, как записано команда, которая обращается к образцу в первом подпроцессе, где используется вложение. [...] Операции загрузки для вложений с цветным форматом выполняются на этапе конвейера VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
.
VK_ATTACHMENT_LOAD_OP_LOAD
[...] Для вложений с цветным форматом используется тип доступа VK_ACCESS_COLOR_ATTACHMENT_READ_BIT
.
VK_ATTACHMENT_LOAD_OP_CLEAR
(или VK_ATTACHMENT_LOAD_OP_DONT_CARE
) [...] Для вложений с цветным форматом используется тип доступа VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT
.
Операция загрузки происходит как часть первого подпроцесса, который использует вложение (ваш .dstSubpass
). И вышесказанное однозначно определяет ваши .dstStageMask
и .dstAccessMask
)
Теперь дело доходит до нашего выбора pWaitDstStageMask
и .srcStageMask
и .srcAccessMask
. Вы указываете, что это pWaitDstStageMask = COLOR_ATTACHMENT_OUTPUT
, .srcStageMask = COLOR_ATTACHMENT_OUTPUT
и .srcAccessMask = 0
.
Операция ожидания семафора должна произойти, прежде чем VkSubpassDependency
. Это указывается как цепочка зависимостей :
Цепочка зависимостей выполнения - это последовательность зависимостей выполнения, которые формируют отношение «до того» между первой зависимостью A ' и окончательная зависимость B '. Для каждой последовательной пары зависимостей выполнения существует цепочка, если пересечение B S в первой зависимости и A S в вторая зависимость не является пустым набором.
Т.е. два последующих примитива синхронизации также синхронизируются друг с другом и образуют переходное свойство. Наш A ' здесь - это сигнал семафора, а наш B' - это область видимости VkSubpassDependency
. Наша B S - это область видимости семафора, т.е. pWaitDstStageMask
. И наша A S является областью sr c нашего VkSubpassDependency
.
Так что наше пересечение pWaitDstStageMask
с .srcStageMask
все еще COLOR_ATTACHMENT_OUTPUT
, Таким образом, формируется цепочка зависимостей, которая гарантирует, что сигнал семафора происходит - до COLOR_ATTACHMENT_OUTPUT
команд в подпроцессе 0
прохода рендеринга.
Теперь, собрав все воедино: сигнал семафора из vkAcquireNextImage
делает образ swapchain доступным из для чтения механизма представления. Ожидание семафора в vkQueueSubmit
делает образ подкачки видимым для , все команды в пакете ограничены COLOR_ATTACHMENT_OUTPUT
. VkSubpassDependency
цепочки к этому семафору ждут. Изображение по-прежнему видно , поэтому дополнительная зависимость от памяти не требуется, поэтому наш .srcAccessMask
равен 0
. Переход макета записывает изображение и делает его (неявно) доступным из перехода макета и видимым для независимо от того, * .dst*
был предоставлен VkSubpassDependency
.