代码之家  ›  专栏  ›  技术社区  ›  nikitablack

将缓冲区绑定到内存时使用正确的偏移量

  •  2
  • nikitablack  · 技术社区  · 6 年前

    我有一大块设备内存和多个我想要绑定的统一缓冲区。显然,我需要一个补偿。让我们看看文档的用途 vkBindBufferMemory 说:

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

    记忆偏移 必须是 alignment 的成员 这个 VkMemoryRequirements 从调用返回的结构 vkGetBufferMemoryRequirements 带缓冲器

    很明显,我有多个使用相同标志创建的统一缓冲区,所以我可以对所有这些缓冲区使用相同的对齐方式。但是等等,还有另一个用法说明 VK缓冲存储器 在规格中:

    如果缓冲区是用 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT , 记忆偏移 必须是的倍数 VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment

    这是令人困惑的。我能安全使用吗 vkPhysicalDeviceLimits::MinInFormBufferOffsetAlignment 对于我的情况,还是我应该比较一下 VkMemoryRequirements::alignment 选择最低的?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Ekzuzy    6 年前

    首先,一个简短的提示:如果你想比较 VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment 具有 VkMemoryRequirements::alignment 然后您应该选择这两个值中的最大值,而不是最小值。

    但在规范中,我们也可以看到:

    实现可以保证内存的某些属性 要求返回者 vkGetBufferMemoryRequirements vkGetImageMemoryRequirements :

    • 对中构件完全相同 VkBuffer 使用相同的值组合创建的对象 usage flags 中的成员 VkBufferCreateInfo 结构传递给 vkCreateBuffer .
    • 对齐成员满足与 VK缓冲器 S 使用 :
      • 如果包括使用 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT , alignment 必须是的整数倍 VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment .
      • 如果包括使用 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT , 对齐 必须是的整数倍 vkPhysicalDeviceLimits::MinInFormBufferOffsetAlignment .
      • 如果包括使用 VK_BUFFER_USAGE_STORAGE_BUFFER_BIT , 对齐 必须是的整数倍 VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment .

    因此,您不必对它们进行比较,只需获取 vkGetBufferMemoryRequirements() 中的函数 VkMemoryRequirements 结构。

    基于以上信息,我认为 vkPhysicalDeviceLimits::MinInFormBufferOffsetAlignment 当使用动态均匀缓冲区作为在 vkCmdBindDescriptorSets() 函数调用也必须是上述值的倍数。