我有一大块设备内存和多个想要绑定的统一缓冲区。显然,我需要一个补偿。让我们看看文档是怎么vkBindBufferMemory说的:
memoryOffset是要绑定到缓冲区的内存区域的起始偏移量...
memoryOffset必须是调用 with buffer返回的结构alignment成员的整数倍VkMemoryRequirementsvkGetBufferMemoryRequirements
好的,很清楚 - 我有多个使用相同标志创建的统一缓冲区,因此我可以对所有缓冲区使用相同的对齐方式。但是等等,规格中还有另一个使用说明vkBindBufferMemory:
如果缓冲区是用创建的
VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,memoryOffset则必须是VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment
这很令人困惑。我可以安全地用于VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment我的情况,还是应该将其进行比较VkMemoryRequirements::alignment并选择最低的?
首先,快速说明:如果您想VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment与VkMemoryRequirements::alignmentthen 进行比较,您应该选择这两个值中的最大值,而不是最低(最小)值。
但在规范中我们还可以读到:
\n\n\n\n\n\n\n
vkGetBufferMemoryRequirements该实现保证了and 返回的内存要求的某些属性vkGetImageMemoryRequirements:\n
\n- 对于使用传递给 的结构中和成员
\nVkBuffer的值的相同组合创建的所有对象,对齐成员都是相同的。usageflagsVkBufferCreateInfovkCreateBuffer- 对齐成员满足与
\nVkBuffer\xe2\x80\x99s关联的缓冲区描述符偏移对齐要求usage:\n \n\n
- 如果使用包括
\nVK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT或VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT,则alignment必须是 的整数倍VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment。- 如果包含使用量
\nVK_BUFFER_USAGE_UNIFORM_BUFFER_BIT,alignment则必须是整数倍VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment。- 如果包含使用量
\nVK_BUFFER_USAGE_STORAGE_BUFFER_BIT,alignment则必须是 的整数倍VkPhysicalDeviceLimits::minStorageBufferOffsetAlignment。
因此,您不必比较它们,而只需采用vkGetBufferMemoryRequirements()结构中函数返回的对齐值(的倍数) VkMemoryRequirements。
基于以上信息,我认为VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment在使用动态统一缓冲区时该值更为重要,因为在vkCmdBindDescriptorSets()函数调用期间提供的偏移值也必须是上述值的倍数。
| 归档时间: |
|
| 查看次数: |
1787 次 |
| 最近记录: |