【问题标题】:VkDescriptorSet from previous pipeline giving performance warning来自先前管道的 VkDescriptorSet 给出性能警告
【发布时间】: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


【解决方案1】:

目前,对此还没有真正好的答案。您目前正在做的事情在性能方面应该是非常好的。只是没有办法将您的意图充分传达给调试层。

Vulkan API 无法让您说“我正在设置第 0 组,我不关心后面的任何组。”因此,验证层无法区分这与“我正在设置集合 0,我想保留后面的集合”之间的区别。实际的驱动程序并不关心,但验证层需要知道您的意图。

我建议只是忍受警告。如果你尝试做一些事情,比如让它使用第 1 组或第 2 组,你只会让事情变得更加困难。您必须发明一个管道布局,其中 set 0 是一个空集,但随后您必须将一个空集实际绑定到 set 0。这意味着您必须创建一个空描述符集以在那里绑定。

这只是误报。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多