为什么 vulkan 不能支持同时使用多个子通道和第二个命令缓冲区?

Why vulkan can't support same time use multi subpass and second commandbuffers?

为什么subpass内容不能同时支持VK_SUBPASS_CONTENTS_INLINE和VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS?我想使用 gbuffer 和第二个命令缓冲区来渲染场景。

TL;DR:因为规范是这么说的。将您的内联命令放入一个或多个单独的辅助命令缓冲区。

长版:

Why subpass contents can't at the same time support VK_SUBPASS_CONTENTS_INLINE and VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS?

如果你问为什么你真的不能将它们组合起来,那是因为它们不是位标志,而是一个序列。位标志,如 VkBufferUsageFlagBits 通常具有代表 32 位值中的单个位的值。

VkSubpassContents 这样的序列的值从 0 开始,每次递增 1(尽管扩展提供的值通常会向前跳转)。

由于 VK_SUBPASS_CONTENTS_INLINE 字面上是 0,因此无法将它与字面上是 1 的 VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS 组合。

如果你问为什么 VkSubpassContents 是一个序列而不是一个位标志,这就是规范的方式。似乎让子通道同时包含内联命令和辅助缓冲区可能是微不足道的,但对于使用 API 的人来说,这可能只是 似乎 ,而不是人们谁必须实施后端。它可能会造成一些潜在的歧义,或者会使某些线程边缘情况成为实施的噩梦,或类似的事情。

I want to use gbuffer and second command buffers to render scene.

正如 Nicol 在他的评论中指出的那样,没有什么可以阻止您这样做。无论您尝试将什么内联命令与辅助命令缓冲区一起使用,您都可以将其放入 另一个 辅助缓冲区。如果这在某种程度上是有问题的,因为您将许多内联语句与要执行辅助缓冲区的位置交织在一起,那么这听起来更像是一个设计问题,就像您可能正在尝试在不属于的子通道中执行工作一样那里。