Vulkan вы можете сделать вложенные проходы рендеринга? - PullRequest
0 голосов
/ 08 октября 2019

Можно ли вызвать проход рендеринга для другой цели, когда проход рендеринга уже записан?

В псевдокоде (с использованием заголовка hpp) что-то вроде этого:

cmd1.beginRenderPass(&render_pass_info, vk::SubpassContents::eInline); // main fb
cmd2.beginRenderPass(&render_pass_info, vk::SubpassContents::eInline); // off screen fb
// Render to off screen target
cmd2.endRenderPass();

// Render to main target
cmd1.endRenderPass();

1 Ответ

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

Я не уверен, как ваш псевдокод относится к вопросу в вашем заголовке. Видите, вы запускаете проход рендеринга, используя cmd1, который предположительно представляет буфер команд. Затем вы запускаете проход рендеринга, используя cmd2, который предположительно представляет отдельный буфер команд. Поскольку обе эти команды должны выполняться правильно, это означает, что обе они являются первичными буферами команд (поскольку вы не можете начать передачу рендеринга во вторичном буфере команд).

В сочетании с этим фактом является то, что еслиВы запускаете проход рендеринга в буфере команд, вы должны завершить этот проход рендеринга в том же CB. Таким образом, нет возможности перекрывать проходы рендеринга в разных основных буферах команд с точки зрения порядка отправки команд.

Итак ... в чем вопрос? Единственный порядок команд, который имеет значение для Vulkan, это порядок отправки : порядок, в котором буферы команд отправляются в очередь, и порядок команд в каждом буфере. Vulkan не заботится о порядке, в котором команды в одном CB записываются относительно другого CB.

Таким образом, очередь увидит начало одного из проходов рендеринга, затем оно заканчивается, затемзатем начинается, затем заканчиваетсяКод в вашем вопросе не «вкладывает» проходы рендеринга.

Единственно возможное «вложение» проходов рендеринга может произойти, если вы делаете это с одним и тем же CB. И нет, вы не можете их вкладывать.

И это не будет иметь смысла, если бы вы могли.

Если ваша операция «рендеринг в основную цель» требует, чтобы «рендеринг в неэкранную цель» был завершентогда это идентично двум последовательным операциям рендеринга с соответствующими барьерами / зависимостями. И если ни один из них не зависит от другого, то это идентично двум последовательным операциям прохождения рендеринга с нет барьеров / зависимостей между ними.

Единственное место, где это может иметь смысл, - это если вы рендеритена некоторое время к «главной цели», затем хотите отрендериться до «цели вне экрана», используя результаты «основной цели», а затем вернуться к «основной цели» таким образом, чтобы использовать результаты"вне экрана цели". Но это всего лишь один проход рендеринга , с 3-мя подпроцессами, которые используют разные вложения, вместе с соответствующими зависимостями / входными целями между ними.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...