[英]Vulkan: why both primary command buffer and secondary command buffers need to set framebuffer and renderpass?
// 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?
必须将其设置为相同吗?
包含渲染命令的辅助命令缓冲区必须在渲染过程中执行,并且必须在该渲染过程的特定子过程中执行(因此, VkCommandBufferInheritanceInfo::subpass
)。 这是他们的目的。
framebuffer
参数是可选的,并且可以为VK_NULL_HANDLE
。
渲染过程模型本质上要求命令生成的所有方面都能够确定正在发生的事情。 生成渲染命令的方式在许多方面取决于使用哪个渲染通道的哪个子通道。 这是整个机制的核心。
初级/次级CB区别允许在主命令缓冲区(包含开始,结束和子遍切换操作)中定义渲染传递操作的结构,而实际的渲染命令可以在其他命令的次级命令缓冲区中构建线程。 但是,为了使其他线程能够完成其工作,他们必须知道如何使用它们。 因此,需要渲染通道。
这是一个API设计问题。 非局内人的任何回答最多都将基于观点。
最准确的答案(似乎没人喜欢听)很简单:因为Vulkan规范要求您这么做。
从表面vkCmdBeginRenderPass
,辅助命令缓冲区是在vkCmdBeginRenderPass
之前vkCmdBeginRenderPass
。 因此,如果驱动程序可能需要在辅助vkBeginCommandBuffer
处知道(或有某种优势),则必须在该点提供渲染过程句柄。
对于VkFramebuffer
,规范说它是可选的,但是提供它可能会产生更好的性能。
必须将其设置为相同吗?
适当的VU:
如果
vkCmdExecuteCommands
被一个渲染过程实例中调用,渲染指定传球pBeginInfo::pInheritanceInfo::renderPass
的成员vkBeginCommandBuffer
用于开始记录的命令中的每个元素pCommandBuffers
必须 兼容与当前渲染过程。
和
如果
vkCmdExecuteCommands
被称为渲染过程实例中,和任何元素pCommandBuffers
记录了与VkCommandBufferInheritanceInfo::framebuffer
不等于VK_NULL_HANDLE
,即VkFramebuffer
必须匹配VkFramebuffer
在当前的渲染过程实例使用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.