如何解决获取给定设备上统一缓冲区的偏移对齐
是否有任何方法可以在给定 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_BIT
,alignment
必须是VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment
的整数倍。
(这意味着 minUniformBufferOffsetAlignment
中的任何 VkBuffer
对齐块都可以用于统一缓冲区描述符。但 VkBuffer
的基偏移可能需要更强烈地对齐比其中描述符的偏移量)。
但是,如果您确实创建了代理 VkBuffer
并查询其对齐方式,则可以保证具有相同用法和标志的其他 VkBuffers
的对齐方式将具有相同的对齐要求:
- 对于使用传递的
alignment
结构中的VkBuffer
和usage
成员的相同值组合创建的所有flags
对象,VkBufferCreateInfo
成员是相同的到vkCreateBuffer
。
由于缓冲区大小不会影响对齐,因此可以使用您建议的微小代理缓冲区。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。