【问题标题】:Vulkan: why both primary command buffer and secondary command buffers need to set framebuffer and renderpass?Vulkan:为什么主命令缓冲区和辅助命令缓冲区都需要设置帧缓冲区和渲染通道?
【发布时间】:2019-09-06 03:28:14
【问题描述】:
// Contains the list of secondary command buffers to be submitted
std::vector<VkCommandBuffer> secondaryCommandBuffers;

// Inheritance info for the secondary command buffers
VkCommandBufferInheritanceInfo inheritanceInfo = {};
...
inheritanceInfo.renderPass = renderpass;   <-------------
inheritanceInfo.framebuffer = frameBuffer; <-------------
...

VkCommandBufferBeginInfo secondaryCommandBufferBeginInfo = {};
...
commandBufferBeginInfo.pInheritanceInfo = &inheritanceInfo;
...
vkBeginCommandBuffer(secondaryCommandBuffers[i], &secondaryCommandBufferBeginInfo);
vkEndCommandBuffer(secondaryCommandBuffers[i]);


// renderPassBeginInfo for the primary command buffer
VkRenderPassBeginInfo renderPassBeginInfo = {};
...
renderPassBeginInfo.renderPass = renderPass;    <-------------
renderPassBeginInfo.framebuffer = frameBuffer;  <-------------

vkBeginCommandBuffer(primaryCommandBuffer, &cmdBufInfo);
vkCmdBeginRenderPass(primaryCommandBuffer, &renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
vkCmdExecuteCommands(primaryCommandBuffer, secondaryCommandBuffers.size(), secondaryCommandBuffers.data());
vkEndCommandBuffer(primaryCommandBuffer);

为什么辅助命令缓冲区已经设置了帧缓冲区和渲染通道,并且主命令缓冲区也设置了帧缓冲区和渲染通道?

必须设置为相同吗?

【问题讨论】:

    标签: c++ vulkan


    【解决方案1】:

    包含渲染命令的辅助命令缓冲区必须在渲染通道内执行,并且完全在该渲染通道的特定子通道内执行(因此VkCommandBufferInheritanceInfo::subpass)。这就是他们的目的。

    framebuffer 参数是可选的,可以是VK_NULL_HANDLE

    渲染通道模型本质上需要命令生成的所有方面才能确定正在发生的事情。如何生成渲染命令在很多方面取决于正在使用哪个渲染通道的哪个子通道。这是整个机制的核心。

    主要/次要 CB 区别允许在主要命令缓冲区中定义渲染通道操作的结构(其中包含开始、结束和子通道切换操作),而实际渲染命令可以构建在辅助命令中其他线程上的缓冲区。但是为了让其他线程完成它们的工作,它们必须知道它们是如何被使用的。因此需要渲染通道。

    【讨论】:

      【解决方案2】:

      这是一个 API 设计问题。非内部人士的任何回答充其量都是基于意见的。

      最准确的答案(似乎没人喜欢听)很简单:因为 Vulkan 规范要求您这样做。

      从表面上看,辅助命令缓冲区是在vkCmdBeginRenderPass 之前创建的。因此,如果驱动程序可能需要知道(或知道有一些优势)辅助节点 vkBeginCommandBuffer 处的渲染通道环境,则必须在该点提供渲染通道句柄。

      至于VkFramebuffer,规范说它是可选的,但提供它可能会产生更好的性能。

      必须设置为相同吗?

      适当的 VU:

      如果在渲染通道实例中调用vkCmdExecuteCommands,则在用于开始记录pCommandBuffers 的每个元素的vkBeginCommandBuffer 命令的pBeginInfo::pInheritanceInfo::renderPass 成员中指定的渲染通道必须使用当前渲染通道为compatible

      如果在渲染通道实例中调用vkCmdExecuteCommands,并且pCommandBuffers 的任何元素被记录为VkCommandBufferInheritanceInfo::framebuffer 不等于VK_NULL_HANDLE,则VkFramebuffer 必须 匹配VkFramebuffer 在当前渲染通道实例中使用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多