使用vulkan时记录命令的正确方法是什么?

时间:2019-01-09 13:58:12

标签: vulkan

当我在同一vkCmdBeginRenderPass上调用vkCmdEndRenderPassCommandBuffer时,一切都很好。

如果我在不同的CommandBuffer上调用这两个函数。我收到一个错误,说If commandBuffer is a primary command buffer, there must not be an active render pass instance.,文档说vkCmdEndRenderPass只能在渲染过程实例内部调用。我不知道render pass instance到底是什么。我想我必须在同一CommandBuffer上调用这两个函数。这是否意味着我必须先记录整个帧,然后才能将任何内容提交给GPU进行绘制?只是感觉不对。

1 个答案:

答案 0 :(得分:2)

渲染过程是您从vkCreateRenderPass获得的回报;即VkRenderPass对象。可以将其视为代码中的类定义。

渲染过程 instance 是命令缓冲区内激活特定渲染过程的时间段。对于主命令缓冲区,这是vkCmdBeginRenderPassvkCmdEndRenderPass调用之间的空间。对于辅助命令缓冲区, entire CB在特定渲染阶段(以及该渲染阶段的单个子阶段)内执行,或者都不在渲染阶段执行。但是无论哪种方式,您都可以使用相同的VkRenderPass对象来创建多个渲染过程实例。

如果要记录来自多个线程的渲染过程命令,请使用辅助命令缓冲区。确实,允许这样做是根本没有辅助命令缓冲区的主要原因。

因此,您有一堆线程创建了一堆辅助命令缓冲区,每个辅助命令缓冲区都从主CB继承了渲染通过状态。构建辅助CB之后,主线程将创建一个简短的主要命令缓冲区,该缓冲区仅使用vkCmdExecuteCommands来执行那些辅助CB。然后将主CB提交到队列。