Vulkan 内存对齐要求

Vulkan memory alignment requirements

我正在为 Vulkan 设备内存实现一个简单的内存管理器,并希望确保我了解内存的对齐要求以及如何满足它们。

因此,假设我已经使用 vkAllocateMemory 分配了 'pool' 内存,并希望将此池中的内存块再分配给各个资源(基于 VkMemoryRequirements 结构),将使用以下伪代码能够按照正确的大小和对齐要求分配一段内存吗?

换句话说,我们是否只需要确保 Offset 是 RequiredAlignment 的倍数?

In other words, do we just need to make sure that Offset is a multiple of RequiredAlignment?

对齐几乎足够了。

vkBindbufferMemory 有效用法 要求之一是:

memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetBufferMemoryRequirements with buffer

并且在vkBindImageMemory有效用法要求中有平行语句:

memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from a call to vkGetImageMemoryRequirements with image

如果前一个块包含非线性资源而当前块是线性资源,反之亦然,则对齐要求是 VkMemoryRequirements.alignment 和设备的 bufferImageGranularity 的最大值。这还需要检查内存块的末尾。

但是您还需要考虑到必须在 VkMemoryRequirementsmemoryTypeBits 标志中设置池的内存类型。