【问题标题】:Use correct offset when binding a buffer to a memory将缓冲区绑定到内存时使用正确的偏移量
【发布时间】:2018-07-20 18:53:22
【问题描述】:

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

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

memoryOffset 必须是 alignment 成员的整数倍 从调用返回的 VkMemoryRequirements 结构 vkGetBufferMemoryRequirements 带缓冲区

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

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

这令人困惑。我可以安全地使用VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment 来处理我的情况,还是应该将其与VkMemoryRequirements::alignment 进行比较并选择最低的?

【问题讨论】:

    标签: vulkan


    【解决方案1】:

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

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

    该实现保证有关内存的某些属性 vkGetBufferMemoryRequirements 返回的要求和 vkGetImageMemoryRequirements:

    • 所有 VkBuffer 对象的对齐成员都是相同的,这些对象是使用传递给 vkCreateBufferVkBufferCreateInfo 结构中的 usageflags 成员的相同值组合创建的。
    • 对齐成员满足与VkBufferusage 关联的缓冲区描述符偏移对齐要求:
      • 如果包含VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BITVK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT 的用法,alignment 必须是VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment 的整数倍。
      • 如果包含使用 VK_BUFFER_USAGE_UNIFORM_BUFFER_BITalignment 必须是 VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment 的整数倍。
      • 如果包含使用 VK_BUFFER_USAGE_STORAGE_BUFFER_BITalignment 必须是 VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment 的整数倍。

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

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

    【讨论】:

    • 谢谢。我错过了文档的那部分。 minUniformBufferOffsetAlignment 的另一个好处是它可以减少内存的总大小。例如,如果我在一个缓冲区中需要 16 个浮点数,但 VkMemoryRequirements::alignment 返回 256,这显然是浪费空间。如果minUniformBufferOffsetAlignment 更小,则应该选择它(这就是我在写最低值时的意思)。
    • FWIW,关于 VkMemoryRequirements::alignment 是各种 min*BufferOffsetAlignment 值的整数倍的语言仅在规范版本 v1.1.77(约 5 周前)中添加,因此它可能不存在在您最初查看的版本中。但这始终是我们的初衷,并且长期以来一直对其进行一致性测试,因此您应该能够依赖它。
    • 另外,如果minUniformBufferOffsetAlignment 小于VkMemoryRequirements::alignment,则绑定到它是不安全的。在将 VkBuffer 绑定到 VkDeviceMemory 时,您必须遵守所需的对齐方式,除了 minUniformBufferOffsetAlignment 之外,可能还有其他约束。 但是当使用非零动态偏移时,您只能对齐到minUniformBufferOffsetAlignmentVkMemoryRequirements::alignment 仅适用于缓冲区/内存绑定偏移量,而minUniformBufferOffsetAlignment 适用于描述符偏移量。
    猜你喜欢
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-09-19
    • 2012-12-08
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多