vkCmdPipelineBarrier уточнение в областях синхронизации passpass - PullRequest
1 голос
/ 25 октября 2019

Глядя на спецификацию vulkan после того, как меня перепутали предыдущие версии, я увидел следующее обновленное разъяснение vkCmdPipelineBarrier:

Если vkCmdPipelineBarrier было записано вне рендерапередать экземпляр, первая область синхронизации включает в себя все команды, которые встречаются ранее в порядке отправки. Если vkCmdPipelineBarrier было записано внутри экземпляра прохода рендеринга, первая область синхронизации включает в себя только те команды, которые встречаются ранее в порядке отправки в пределах того же подпроцесса. В любом случае первая область синхронизации ограничена операциями наЭтапы конвейера, определенные маской этапа источника, заданной srcStageMask.

Если vkCmdPipelineBarrier было записано вне экземпляра прохода рендеринга, вторая область синхронизации включает в себя все команды, которые появляются позже в порядке отправки. Если vkCmdPipelineBarrier было записано внутри экземпляра прохода рендеринга, вторая область синхронизации включает в себя только команды, которые появляются позже в порядке отправки в пределах того же подпроцесса. В любом случае вторая область синхронизации ограничена операциями надЭтапы конвейера определяются маской этапа назначения, заданной dstStageMask.

Если я правильно понимаю, эти утверждения говорят, что:

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

  • вторая область синхронизации - это возможные команды, используемые для того, что можно рассматривать для синхронизации после (пункт назначения)

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

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

Верны ли эти примеры синхронизации?

, если за пределами прохода рендеринга я делаю что-то вроде:

1. transfer;
2. computeDispatch;
3. beginRenderPass;
...
endRenderPass;

pipelineBarrier(...);

4. computeDispatch;
5. beginRenderPass;
...
endRenderPass;

команды1, 2 и 3 будут рассматриваться в pipeBarrier для синхронизации до, т. Е. Находиться в первой области синхронизации, а команды 4 и 5 будут рассматриваться позже, т.е. во второй области синхронизации.

если у меня есть следующий список команд:

1. transfer;
2. computeDispatch;
3. beginRenderPass;
   3.1 next subpass;
       3.1.1 bindPipeline;
       3.1.2 bindDescriptor;
       3.1.3 bindVertexBuffer;

       pipelineBarrier(...);

       3.1.4 bindIndexBuffer;
       3.1.5 drawIndexed;
endRenderPass;

4. computeDispatch;
5. beginRenderPass;
...
endRenderPass;

, команды 1, 2, 3.1.1, 3.1.2 и 3.1.3 будут в первой области синхронизации, и3.1.4 и 3.1.5, 4, 5 будут во втором.

и, наконец, выделенный жирным шрифтом фрагмент текста говорит, что если я сделаю следующее:

1. transfer;
2. computeDispatch;
3. beginRenderPass;
   3.1 first subpass;
       3.1.1 bindPipeline;
       3.1.2 bindDescriptors;
       3.1.3 bindVertexBuffer;
       3.1.4 draw;
   3.2 next subpass;
       3.2.1 bindPipeline;
       3.2.2 bindDescriptor;
       3.2.3 bindVertexBuffer;

       pipelineBarrier(...);

       3.2.4 bindIndexBuffer;
       3.2.5 drawIndexed;
   3.3 next subpass;
       3.3.1 bindPipeline;
       3.3.2 bindDescriptors;
       3.3.4 draw;
endRenderPass;

4. computeDispatch;
5. beginRenderPass;
...
endRenderPass;

команды 1,2, 3.2.1, 3.2.2 и 3.2.3 будутв первой области синхронизации, а команды 3.2.4, 3.2.5, 4 и 5 будут во второй области синхронизации правильными? Другими словами, другие подпроцессы не рассматриваются для областей синхронизации для барьеров конвейера, используемых в проходе рендеринга? только текущий подпункт?

1 Ответ

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

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

Онине рассматриваются. Непосредственно .

Конвейерная преграда в субпроходе создаст зависимость между командами в субпроходе. Подпроходные зависимости создают зависимости между подпроходами. Внешние зависимости подпроцесса создают зависимости между подпроходом и командами до / после прохода рендеринга.

Если подпроход 1 не может начать свое выполнение, пока не завершится подпроход 0 (и, следовательно, между ними существует зависимость), тогда любойКоманды в субпроходе 1 могут предполагать, что субпропуск 0 выполнен. Это включает в себя барьеры. Так что это делает зависимости переходными ;Вещество после барьера в субпроходе 1 может предполагать, что субпроход 0 завершен, потому что все в субпроходе 1 может сделать это предположение. Точно так же команды в подпроцессе (например, барьеры) будут зависеть от любых внешних зависимостей, от которых напрямую или косвенно зависит подпропуск.

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

...