我正在为 Vulkan 设备内存实现一个简单的内存管理器,并希望确保我了解内存的对齐要求以及如何满足这些要求。
因此,假设我使用 vkAllocateMemory 分配了一个内存“池”,并希望将该池中的内存块子分配给各个资源(基于 VkMemoryRequirements 结构),以下伪代码是否能够分配该内存具有正确的大小和对齐要求吗?
- 使用RequiredSize和RequiredAlignment请求内存
- 遍历池中的块,寻找空闲且大小 > requiredSize 的块
- 如果当前块在内存中的偏移量不能被RequiredAlignment整除,则计算对齐方式和余数之间的差异
- 如果当前块的大小减去差值小于RequiredSize,则跳到池中的下一个块
- 如果差值大于0,则插入大小等于差值的填充块,并调整当前未分配的块大小和偏移量
- 从当前未分配块(现已对齐)的开头分配RequiredSize字节,相应地调整未分配块的大小和偏移量
- 返回 vkDeviceMemory 句柄(池的)、大小和偏移量(新分配块的)
- 如果我们到达块列表的末尾,则该池无法分配内存
换句话说,我们是否只需要确保Offset是RequiredAlignment的倍数就可以了?
换句话说,我们是否只需要确保Offset是RequiredAlignment的倍数就可以了?
对于对齐来说这几乎足够了。
in vkBindbuffer内存 https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#vkBindBufferMemory中的一个有效使用要求是:
memoryOffset
must是的整数倍alignment
的成员VkMemoryRequirements
调用返回的结构vkGetBufferMemoryRequirements
with buffer
并且有一个平行的声明有效使用的要求vkBindImageMemory https://www.khronos.org/registry/vulkan/specs/1.0-extensions/html/vkspec.html#vkBindImageMemory:
memoryOffset
must是的整数倍alignment
的成员VkMemoryRequirements
调用返回的结构vkGetImageMemoryRequirements
with image
如果前一个块包含非线性资源,而当前块包含线性资源,反之亦然,则对齐要求为 VkMemoryRequirements.alignment 和设备的 bufferImageGranularity 中的最大值。这还需要检查内存块的末尾。
However您还需要考虑到池的内存类型必须在memoryTypeBits
的旗帜VkMemoryRequirements
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)