Как правильно записывать команды при использовании vulkan? - PullRequest
0 голосов
/ 09 января 2019

Когда я вызываю vkCmdBeginRenderPass и vkCmdEndRenderPass на одном и том же CommandBuffer, все в порядке.

Если я вызову эти две функции на разных CommandBuffer с. Я получил ошибку, в которой говорится, что If commandBuffer is a primary command buffer, there must not be an active render pass instance. И в документе говорится, что vkCmdEndRenderPass должен вызываться только внутри экземпляра прохода рендеринга. Я точно не знаю, что такое render pass instance. Я думаю, что я должен вызвать эти две функции на одном и том же CommandBuffer. Разве это не означает, что я должен записать весь кадр, прежде чем я смогу что-либо передать в графический процессор для рисования? Просто не чувствую себя хорошо.

1 Ответ

0 голосов
/ 09 января 2019

Пропуск рендера - это то, что вы получаете от vkCreateRenderPass; то есть объект VkRenderPass. Думайте об этом как об определении класса в вашем коде.

проход рендеринга экземпляр - это период в буфере команд, в течение которого активен определенный проход рендеринга. Для основных командных буферов это интервал между вызовами vkCmdBeginRenderPass и vkCmdEndRenderPass. Для вторичных буферов команд либо весь CB выполняется в пределах определенного прохода рендеринга (и одного подпроцесса этого прохода рендеринга), либо ни один из них не выполняется в проходе рендеринга. Но в любом случае вы можете использовать один и тот же объект VkRenderPass для создания нескольких экземпляров прохода рендеринга.

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

Итак, у вас есть куча потоков, создающих кучу вторичных командных буферов, каждый из которых наследует состояние прохода рендеринга от первичного CB. После построения вторичных CB, основной поток создает короткий основной буфер команд, который просто использует vkCmdExecuteCommands для выполнения этих вторичных CB. А затем вы отправляете основной CB в очередь.

...