Vulkan 内存对齐要求
Vulkan memory alignment requirements
我正在为 Vulkan 设备内存实现一个简单的内存管理器,并希望确保我了解内存的对齐要求以及如何满足它们。
因此,假设我已经使用 vkAllocateMemory 分配了 'pool' 内存,并希望将此池中的内存块再分配给各个资源(基于 VkMemoryRequirements 结构),将使用以下伪代码能够按照正确的大小和对齐要求分配一段内存吗?
- 使用 RequiredSize 和 RequiredAlignment 请求内存
- 遍历池中的块以寻找空闲且大小 > RequiredSize
- 如果当前块在内存中的偏移量不能被RequiredAlignment整除,求出对齐与余数的差值
- 如果当前块的大小减去差值小于RequiredSize,则跳转到池中的下一个块
- 如果差值大于0,则插入一个大小等于差值的填充块,并调整当前未分配块大小和偏移量
- 从当前未分配块的开头分配 RequiredSize 字节(现在已对齐),相应地调整未分配块的大小和偏移量
- Return vkDeviceMemory 句柄(池的)、大小和偏移量(新分配块的)
- 如果我们到达块列表的末尾,则此池无法分配内存
换句话说,我们是否只需要确保 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 的最大值。这还需要检查内存块的末尾。
但是您还需要考虑到必须在 VkMemoryRequirements
的 memoryTypeBits
标志中设置池的内存类型。
我正在为 Vulkan 设备内存实现一个简单的内存管理器,并希望确保我了解内存的对齐要求以及如何满足它们。
因此,假设我已经使用 vkAllocateMemory 分配了 'pool' 内存,并希望将此池中的内存块再分配给各个资源(基于 VkMemoryRequirements 结构),将使用以下伪代码能够按照正确的大小和对齐要求分配一段内存吗?
- 使用 RequiredSize 和 RequiredAlignment 请求内存
- 遍历池中的块以寻找空闲且大小 > RequiredSize
- 如果当前块在内存中的偏移量不能被RequiredAlignment整除,求出对齐与余数的差值
- 如果当前块的大小减去差值小于RequiredSize,则跳转到池中的下一个块
- 如果差值大于0,则插入一个大小等于差值的填充块,并调整当前未分配块大小和偏移量
- 从当前未分配块的开头分配 RequiredSize 字节(现在已对齐),相应地调整未分配块的大小和偏移量
- Return vkDeviceMemory 句柄(池的)、大小和偏移量(新分配块的)
- 如果我们到达块列表的末尾,则此池无法分配内存
换句话说,我们是否只需要确保 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 thealignment
member of theVkMemoryRequirements
structure returned from a call tovkGetBufferMemoryRequirements
withbuffer
并且在vkBindImageMemory的有效用法要求中有平行语句:
memoryOffset
must be an integer multiple of thealignment
member of theVkMemoryRequirements
structure returned from a call tovkGetImageMemoryRequirements
withimage
如果前一个块包含非线性资源而当前块是线性资源,反之亦然,则对齐要求是 VkMemoryRequirements.alignment 和设备的 bufferImageGranularity 的最大值。这还需要检查内存块的末尾。
但是您还需要考虑到必须在 VkMemoryRequirements
的 memoryTypeBits
标志中设置池的内存类型。