首页 > 解决方案 > 将缓冲区绑定到内存时使用正确的偏移量

问题描述

我有一大块设备内存和多个要绑定的统一缓冲区。显然,我需要一个偏移量。让我们看看文档是怎么vkBindBufferMemory说的:

memoryOffset是要绑定到缓冲区的内存区域的起始偏移量...

memoryOffset必须是从调用 with buffer返回alignment的结构成员的整数倍VkMemoryRequirementsvkGetBufferMemoryRequirements

好的,这很清楚 - 我创建了多个使用相同标志的统一缓冲区,因此我可以对所有缓冲区使用相同的对齐方式。vkBindBufferMemory但是等等,规格中还有另一个使用说明:

如果缓冲区是用VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, memoryOffset必须是的倍数 VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment

这很令人困惑。我可以安全地VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment用于我的箱子还是应该比较它VkMemoryRequirements::alignment并选择最低的?

标签: vulkan

解决方案


首先,快速说明:如果要VkPhysicalDeviceLimits::minUniformBufferOffsetAlignmentVkMemoryRequirements::alignmentthen 进行比较,您应该选择这两个值中的最大值,而不是最低(最小)值。

但在规范中我们也可以阅读:

vkGetBufferMemoryRequirements该实现保证了与 返回的内存需求有关的某些属性vkGetImageMemoryRequirements

  • 对于使用传递给的结构中的和成员VkBuffer的相同值组合创建的所有对象,对齐成员都是相同的。usageflagsVkBufferCreateInfovkCreateBuffer
  • VkBuffer对齐成员满足与's关联的缓冲区描述符偏移对齐要求usage
    • 如果包含使用VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BITVK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BITalignment则必须是 的整数倍VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment
    • 如果包括用法VK_BUFFER_USAGE_UNIFORM_BUFFER_BITalignment则必须是 的整数倍VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment
    • 如果包括用法VK_BUFFER_USAGE_STORAGE_BUFFER_BITalignment则必须是 的整数倍VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment

因此,您不必比较它们,而只需获取结构中vkGetBufferMemoryRequirements()函数返回的(多个)对齐值VkMemoryRequirements

基于以上信息,我认为VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment在使用动态统一缓冲区时值更重要,因为在vkCmdBindDescriptorSets()函数调用期间提供的偏移值也必须是上述值的倍数。


推荐阅读