Vulkan:可以在renderpass之前生成辅助命令缓冲区吗?

时间:2018-02-15 04:30:17

标签: vulkan

-----------------原始问题------------------------

在Vulkan,

为了开始向辅助命令缓冲区发出命令,是否必须已经获取了映像并且在主命令缓冲区上调用了vkCmdBeginRenderPass()?

我是个菜鸟,但这对我来说就是这样。

------------------------ EDIT#2 -------------------- ------------

是的,可以这样做:

  1. 可能是异步的,处理逻辑并在辅助命令缓冲区中记录绘制调用。
  2. 检查是否记录了辅助命令缓冲区:如果没有,请转到#1,否则继续。
  3. 获取图片
  4. 启动主命令缓冲区;启动渲染通道。
  5. 执行以前记录的辅助命令缓冲区
  6. 提交
  7. 当前

3 个答案:

答案 0 :(得分:2)

这取决于“发出”命令到辅助命令缓冲区和命令的含义你想在这些辅助命令缓冲区中记录。

并非所有命令都可以记录在辅助命令缓冲区中。但是有些命令可以记录,并且与渲染无关(因此使用渲染过程) - 数据复制,时间戳(定时器查询)这些都是示例。它们没有以任何方式与渲染过程相关联,因此它们不需要您开始渲染过程。

但是如果你想记录绘图命令,并且你可能知道,绘图只能在渲染过程中完成,那么渲染过程需要已经启动(在调用这个辅助命令缓冲区的主命令缓冲区中)。

对于vkAcquireNextImageKHR()函数 - 此函数是独立的。如果通过“发出”你的意思是录音,那么你不需要调用这个功能。您可以记录所需的任何(有效)命令。录制只是准备供以后使用的命令,用于提交。这同样适用于您的问题的标题:

  

可以在renderpass之前生成辅助命令缓冲区吗?

我知道这是(希望)只是一个不好的措辞,但你可以随时记录任何命令缓冲区。这是提交的计数和提交的命令缓冲区中记录的命令的顺序。那么如何在渲染通过之前生成命令缓冲区?如果要记录绘图命令并启动渲染过程,则需要渲染过程对象。如果要从主命令缓冲区中调用辅助命令缓冲区,并且此辅助命令缓冲区绘制了某些内容,则需要首先记录渲染传递启动命令。之后,您可以调用辅助命令缓冲区。但是必须已经记录了这个辅助命令缓冲区:

  

pCommandBuffers的每个元素必须位于pending或executable中   状态。

所以你需要先记录一个辅助命令缓冲区,然后你可以记录一个调用这个辅助命令缓冲区的主命令缓冲区。

但是如果要提交使用交换链图像的命令缓冲区,则必须已获取此图像。正如我(和其他人)在您的另一个问题(trouble understanding cycling of framebuffers )中所描述的那样,如果尚未获取此图像,则无法提交使用交换链图像的命令。但提交和图像获取与命令缓冲区记录无关。您可以提前记录命令缓冲区。您甚至可以为各种交换链图像预先记录各种命令缓冲区。同样,录制只是准备命令供以后使用。实际使用是在提交时发生的。所以你只能提交那些使用已经获得的交换链图像的命令缓冲区。

我希望这会有所帮助; - )。

答案 1 :(得分:0)

要开始录制辅助命令缓冲区,必须使用vkBeginCommandBuffer对象调用VkCommandBufferInheritanceInfo。如果要在渲染过程中执行辅助CB,则必须提供:

  1. 将在其中执行传递的VkRenderPass对象。请注意,此对象不是 vkCmdBeginRenderPass的产品。

  2. 此辅助CB将在其中执行的上述VkRenderPass的子通道的索引。

  3. 有一个可选的VkFramebuffer,用于指定要渲染的图像。但如前所述,这是可选的。规范说提供这些数据可能有助于提高性能,但它仍然是可选的。

    所以不,没有关于辅助CB的要求,主要CB上有一个活动的渲染传递实例,它将在其中执行。

答案 2 :(得分:0)

是的,可以做我想做的事情,即在必须开始记录主命令缓冲区之前将绘制命令记录到辅助命令缓冲区。

问题是双重的。

  1. 我没有在VkCommandBufferBeginInfo的'flags'成员上为辅助缓冲区设置VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT。
  2. 来自验证层的错误是误导性的,它说:“在Pipeline(0x12)的绘图时没有找到活动的渲染过程!”。这导致我尝试错误的解决方案。