我有一大块设备内存和多个要绑定的统一缓冲区。显然,我需要一个补偿。让我们看看vkBindBufferMemory
的文档是怎么说的:
memoryOffset
是存储器区域的起始偏移量被绑定到缓冲区。。。
memoryOffset
必须是的alignment
成员的整数倍从对的调用返回的CCD_ 5结构带缓冲的vkGetBufferMemoryRequirements
好的,这很清楚-我用相同的标志创建了多个统一缓冲区,所以我可以对所有缓冲区使用相同的对齐方式。但是等一下,规格中还有vkBindBufferMemory
的另一个使用说明:
如果用CCD_ 8创建缓冲区,
memoryOffset
必须是的倍数VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment
这很有说服力。我可以安全地将VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment
用于我的病例吗?还是应该将其与VkMemoryRequirements::alignment
进行比较并选择最低的?
首先,请注意:如果要比较VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment
和VkMemoryRequirements::alignment
,则应选择这两个值中最大的值,而不是最小的值。
但在规范中,我们也可以阅读:
实现保证内存的某些属性
vkGetBufferMemoryRequirements
和vkGetImageMemoryRequirements
:
- 对于使用传递给
vkCreateBuffer
的VkBufferCreateInfo
结构中usage
和flags
成员的相同值组合创建的所有VkBuffer
对象,对齐成员是相同的- 对齐成员满足与
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
的整数倍
因此,您不必对它们进行比较,只需获取VkMemoryRequirements
结构中vkGetBufferMemoryRequirements()
函数返回的对齐值(的倍数(。
基于以上信息,我认为当使用动态统一缓冲区时,VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment
值更重要,因为在vkCmdBindDescriptorSets()
函数调用期间提供的偏移值也必须是上述值的倍数。