首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vulkan内存对齐要求

Vulkan内存对齐要求
EN

Stack Overflow用户
提问于 2017-08-02 10:56:35
回答 1查看 4.2K关注 0票数 3

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

因此,假设我已经使用vkAllocateMemory分配了一个“内存池”,并且希望将这个池中的内存块子分配给单个资源(基于VkMemoryRequirements结构),那么下面的伪代码能够按照正确的大小和对齐要求分配内存的一部分吗?

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-02 11:08:55

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

对于对齐而言,这几乎足够了。

vkBindbufferMemory中,有效的使用要求之一是:

memoryOffset 必须是从对vkGetBufferMemoryRequirementsbuffer调用返回的VkMemoryRequirements结构的alignment成员的整数倍数。

vkBindImageMemory的有效使用要求中有一个并行语句

memoryOffset 必须是从对vkGetImageMemoryRequirementsimage调用返回的VkMemoryRequirements结构的alignment成员的整数倍数。

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45458918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档