Vulkan内存对齐要求

时间:2017-08-02 10:56:35

标签: c++ memory memory-management vulkan

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

因此,假设我使用vkAllocateMemory分配了一个“池”内存,并希望将此池中的内存块分配给各个资源(基于VkMemoryRequirements结构),以下伪代码是否能够分配这个内存的一部分是否具有正确的大小和对齐要求?

  • 使用RequiredSize和RequiredAlignment请求内存
  • 迭代池中的块,寻找一个免费且块大小> gt的块。 RequiredSize
  • 如果当前块的内存偏移量不能被RequiredAlignment整除,请找出对齐与余数之间的差异
  • 如果当前块的大小减去差值小于RequiredSize,则跳到池中的下一个块
  • 如果差值大于0,请插入大小等于差值的填充块,并调整当前未分配的块大小和偏移量
  • 从当前未分配的块(现在已对齐)的开头分配RequiredSize字节,相应地调整未分配块的大小和偏移量
  • 返回vkDeviceMemory句柄(池),大小和偏移量(新分配块)
  • 如果我们到达阻止列表的末尾,则此池无法分配内存

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

1 个答案:

答案 0 :(得分:2)

  

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

用于几乎足够的对齐。

<{3>} 有效使用要求中的

是:

  

memoryOffset 必须alignment VkMemoryRequirements结构的vkGetBufferMemoryRequirements成员的整数倍,该buffer结构是通过memoryOffset alignment调用返回的}}

并且vkBindbufferMemory有效使用要求中有一个并行语句:

  

VkMemoryRequirements 必须vkGetImageMemoryRequirements image结构的memoryTypeBits成员的整数倍,该VkMemoryRequirements结构是通过{{1}} {{1}}调用返回的}}

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

但是您还需要考虑必须在{{1}}的{​​{1}}标记中设置池的内存类型。