我有一大堆设备内存和多个要绑定的统一缓冲区。显然,我需要补偿。让我们看看vkBindBufferMemory
的文档怎么说:
memoryOffset
是内存区域的起始偏移量,即 绑定到缓冲区...
memoryOffset
必须是的alignment
成员的整数倍 调用返回的VkMemoryRequirements
结构vkGetBufferMemoryRequirements
带缓冲区
好吧,很明显-我有多个使用相同标志创建的统一缓冲区,因此我可以对所有缓冲区使用相同的对齐方式。但是,等等,规格中还有vkBindBufferMemory
的另一用法说明:
如果使用
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT
创建了缓冲区,memoryOffset
必须是的倍数VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment
这很令人困惑。我可以安全地使用VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment
还是我应该将其与VkMemoryRequirements::alignment
进行比较并选择最低的?
答案 0 :(得分:3)
首先,请注意:如果要将VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment
与VkMemoryRequirements::alignment
进行比较,则应选择这两个值中的最大值,而不是最低(最小)值。
但是在规范中我们也可以阅读:
该实现保证有关内存的某些属性
vkGetBufferMemoryRequirements
返回的要求,以及vkGetImageMemoryRequirements
:
- 对于所有
VkBuffer
对象,其对齐成员都是相同的,这些对象创建的usage
结构中的flags
和VkBufferCreateInfo
成员的值组合相同,并传递给{{1 }}。- 对齐成员满足与
vkCreateBuffer
的{{1}}相关的缓冲区描述符偏移对齐要求:
- 如果使用情况包括
VkBuffer
或usage
,则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
函数调用期间提供的偏移值也必须是上述值的倍数。