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

时间:2018-07-20 09:51:26

标签: vulkan

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

  

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

     

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

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

  

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

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

1 个答案:

答案 0 :(得分:3)

首先,请注意:如果要将VkPhysicalDeviceLimits::minUniformBufferOffsetAlignmentVkMemoryRequirements::alignment进行比较,则应选择这两个值中的最大值,而不是最低(最小)值。

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

  

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

     
      
  • 对于所有VkBuffer对象,其对齐成员都是相同的,这些对象创建的usage结构中的flagsVkBufferCreateInfo成员的值组合相同,并传递给{{1 }}。
  •   
  • 对齐成员满足与vkCreateBuffer的{​​{1}}相关的缓冲区描述符偏移对齐要求:      
        
    • 如果使用情况包括VkBufferusage,则VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT必须是VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT的整数倍。
    •   
    • 如果使用情况包括alignment,则VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment必须是VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT的整数倍。
    •   
    • 如果使用情况包括alignment,则VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment必须是VK_BUFFER_USAGE_STORAGE_BUFFER_BIT的整数倍。
    •   
  •   

因此,您不必比较它们,而只需采用alignment结构中VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment函数返回的(多个)对齐值。

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