Глядя на спецификацию 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 будут во второй области синхронизации правильными? Другими словами, другие подпроцессы не рассматриваются для областей синхронизации для барьеров конвейера, используемых в проходе рендеринга? только текущий подпункт?