微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

获取给定设备上统一缓冲区的偏移对齐

如何解决获取给定设备上统一缓冲区的偏移对齐

是否有任何方法可以在给定 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT 上使用 VkDevice 的缓冲区所需的分配中接收偏移量的对齐(以字节为单位)?

如果我已经获得了这样的 VkBuffer,那么可以从 size 结构的 VkMemoryRequirements 字段中检索该值,该字段是从对 vkGetBufferMemoryRequirements调用收到的。>

但是如果我想用给定的缓冲区获得这个值,我是否需要创建一个大小为 1 的“虚拟”缓冲区(指定大小 0 会产生一个验证错误,当验证层已启用)?

解决方法

UBO 的对齐要求是设备限制:VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment。这样做的原因是,它不仅适用于将缓冲区绑定到内存分配时使用的偏移量的要求,还适用于使用时在缓冲区内 到 UBO 数据开头的任何偏移量该缓冲区作为 UBO 描述符。

,

如果我理解您的问题是正确的,您正在寻找 memoryOffset 参数与 vkBindBufferMemory 的对齐方式,该对齐方式对您以后创建的任何 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT VkBuffer 都有效.本质上,您希望在 VkMemoryRequirements::alignment 中获得任何此类缓冲区的最坏情况/最严格的对齐方式。正确吗?

我认为您无法直接查询这种最坏情况的对齐方式。 VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment 很接近,但它是缓冲区到内存对齐要求的下限,而不是上限 ([1]):

alignment 成员满足与 VkBuffer 的使用相关的缓冲区描述符偏移对齐要求:

  • 如果 usage 包括 VK_BUFFER_USAGE_UNIFORM_BUFFER_BITalignment 必须是 VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment 的整数倍。

(这意味着 minUniformBufferOffsetAlignment 中的任何 VkBuffer 对齐块都可以用于统一缓冲区描述符。但 VkBuffer 的基偏移可能需要更强烈地对齐比其中描述符的偏移量)。

但是,如果您确实创建了代理 VkBuffer 并查询其对齐方式,则可以保证具有相同用法和标志的其他 VkBuffers 的对齐方式将具有相同的对齐要求:

  • 对于使用传递的 alignment 结构中的 VkBufferusage 成员的相同值组合创建的所有 flags 对象,VkBufferCreateInfo 成员是相同的到vkCreateBuffer

由于缓冲区大小不会影响对齐,因此可以使用您建议的微小代理缓冲区。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。