【发布时间】:2016-07-31 09:17:47
【问题描述】:
Vulkan 允许多组输入描述。在我的用例中,我用 2 个集合渲染一个特定对象。将 0 和 2 个偏移设置到一个动态缓冲区中,该缓冲区包含两个不同偏移位置上的帧数据和对象数据。使用纹理设置 1 以更改每个对象。所以在我第一次通过后,我绑定了 2 套。现在,当我开始下一个子通道并绑定不同的管道时,这两个集合仍然绑定,然后当我尝试绑定集合 0(我现在不需要集合 1)时,我收到关于不兼容的性能警告。
DescriptorSetDS 0x10 previously bound as set #0 is incompatible with set 0x668cec8 newly bound as set #0 so set #1 and any subsequent sets were disturbed by newly bound pipelineLayout (0x64)
现在这对我来说很清楚,我知道第 1 组“受到干扰”。但是我不知道该怎么做就是告诉 vulkan 这是正确的,因此不再给出警告(设计总是出现此错误的软件似乎是错误的)。我希望重置绑定的集合,“解除绑定”集合。但我认为我错过了一些东西,因为我什么也没看到。
当然,也许我做错了什么,或者错过了一些相关的命令,所以我简化了完成的调用顺序:
vkCmdBeginRenderPass
vkCmdBindPipeline
vkCmdBindDescriptorSets -> bind sets: 0, 1
vkCmdBindVertexBuffers
vkCmdDraw
vkCmdNextSubpass
vkCmdBindPipeline (different pipeline)
vkCmdBindDescriptorSets -> bind set: 0 -> error about set disturbance
【问题讨论】:
-
"设计总是出现此错误的软件似乎是错误的" 这不是错误;这是一个警告。虽然它在您的情况下是合法的,但如果有人期望它可以工作,它可能会捕获错误。您可以通过将空集绑定到其他集索引来关闭警告。
-
我认为您可以通过更改最后一组来关闭它。该层试图暗示,最后一组应该改变最多,而第一个最少。或者你现在,通过将状态移动到不同的 CB 来“重置”状态。
-
如何在管道布局中只指定 set 1 的使用?似乎集合的布局是由 VkPipelineLayoutCreateInfo 中的 pSetLayouts 的顺序隐式确定的,它总是从 0 开始。然后你可以在你真正关心的集合 1 之前绑定上一个管道布局中的集合 0,但这看起来很糟糕设计。
标签: vulkan