Vulkan:为什么主要命令缓冲区和辅助命令缓冲区都需要设置帧缓冲区和renderpass?

时间:2019-09-05 17:57:07

标签: c++ vulkan

// 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);

为什么辅助命令缓冲区已经设置了framebuffer和renderpass,以及主命令缓冲区又设置了framebuffer和renderpass?

必须设置为相同吗?

2 个答案:

答案 0 :(得分:1)

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

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

渲染过程模型本质上要求命令生成的所有方面都能够确定正在发生的事情。生成渲染命令的方式在许多方面取决于使用哪个渲染通道的哪个子通道。这是整个机制的核心。

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

答案 1 :(得分:0)

这是一个API设计问题。非局内人的任何回答最多都将基于观点。

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

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

对于VkFramebuffer而言,规范说它是可选的,但可能提供更好的性能。

  

必须设置为相同吗?

适当的VU:

  

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

  

如果在渲染过程实例中调用vkCmdExecuteCommands,并且pCommandBuffers的任何元素都记录有VkCommandBufferInheritanceInfo::framebuffer不等于VK_NULL_HANDLE的那个VkFramebuffer 必须与当前渲染过程实例中使用的VkFramebuffer匹配