【问题标题】:What is the right way to record commands when using vulkan?使用vulkan时记录命令的正确方法是什么?
【发布时间】:2019-01-10 12:55:23
【问题描述】:

当我在同一个CommandBuffer 上调用vkCmdBeginRenderPassvkCmdEndRenderPass 时,一切都很好。

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

【问题讨论】:

    标签: vulkan


    【解决方案1】:

    渲染通道是你从vkCreateRenderPass 得到的;也就是说,VkRenderPass 对象。将其视为代码中的类定义。

    渲染通道实例是命令缓冲区中特定渲染通道处于活动状态的时间段。对于主命令缓冲区,这是vkCmdBeginRenderPassvkCmdEndRenderPass 调用之间的空间。对于辅助命令缓冲区,整个 CB 在特定的渲染通道(以及该渲染通道的单个子通道)内执行,或者没有一个 在渲染通道中执行。但无论哪种方式,您都可以使用相同的 VkRenderPass 对象来创建多个渲染通道实例。

    如果您想记录来自多个线程的渲染过程的命令,您可以使用辅助命令缓冲区。事实上,允许这是辅助命令缓冲区存在的主要原因。

    所以你有一堆线程创建一堆辅助命令缓冲区,每个缓冲区都从主 CB 继承渲染过程状态。在构建辅助 CB 之后,主线程创建一个短的主命令缓冲区,它只使用 vkCmdExecuteCommands 来执行这些辅助 CB。然后将主 CB 提交到队列中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-04
      • 2010-11-11
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 2021-03-03
      • 2019-06-10
      相关资源
      最近更新 更多