Vulkan 内存对齐要求
Vulkan memory alignment requirements
我正在为 Vulkan 设备内存实现一个朴素的内存管理器,并希望确保我了解内存的对齐要求以及如何满足它们。
因此,假设我已经使用 vkAllocateMemory 分配了一个内存"池",并希望将此池中的内存块子分配给各个资源(基于 VkMemoryRequirements 结构(,以下伪代码是否能够分配具有正确大小和对齐要求的内存部分?
- 请求具有所需大小和所需对齐的内存
- 遍历池中的块,寻找一个空闲且大小> RequiredSize 的块
- 如果当前块在内存中的偏移量不能被 RequiredAlignment 整除,请找出对齐和余数之间的差异
- 如果当前块的大小减去差值小于 RequiredSize,请跳到池中的下一个块 如果差值
- 大于 0,则插入大小等于差值的填充块,并调整当前未分配的块大小和偏移量
- 从当前未分配块(现已对齐(的开头分配 RequiredSize 字节,相应地调整未分配块的大小和偏移 量
- 返回 vkDeviceMemory 句柄(池(、大小和偏移量(新分配的块(
- 如果我们到达阻止列表的末尾,则此池无法分配内存
换句话说,我们只需要确保偏移量是必需对齐的倍数吗?
换句话说,我们只需要确保偏移量是必需对齐的倍数吗?
对于对齐,这几乎就足够了。
在 vkBindbufferMemory 中,有效的使用要求之一是:
memoryOffset
必须是调用vkGetBufferMemoryRequirements
withbuffer
返回的VkMemoryRequirements
结构的alignment
成员的整数倍
并且在 vkBindImageMemory 的有效使用要求中有一个并行语句:
memoryOffset
必须是调用vkGetImageMemoryRequirements
withimage
返回的VkMemoryRequirements
结构的alignment
成员的整数倍
如果前一个块包含非线性资源,而当前块是线性的,反之亦然,则对齐要求是 VkMemoryRequirements.align 和设备的 bufferImageGranularity 的最大值。这还需要检查内存块的末端。
但是,您还需要考虑到必须在VkMemoryRequirements
的memoryTypeBits
标志中设置池的内存类型。
相关文章:
- 使 std::vector 分配对齐内存的现代方法
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- Linux C++ 中的页面对齐内存分配
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?
- 如何使用此宏测试是否对齐内存
- g++ 如何对齐内存以确保对齐从缓存行的开头开始?
- 正确对齐内存模板,参数顺序不变
- 在 C/C++ 中在特定地址边界上对齐内存是否仍能提高 x86 性能?
- 读取 /编写部分分配的对齐内存
- 指向对齐内存的指针
- 在C++11中,推荐的对齐内存的方法是什么
- C++-对齐内存
- m = XMMatrixIdentity() - 类中的对齐内存后崩溃
- 新字符是否实际上保证类类型的对齐内存
- 分配32字节对齐内存的分配器
- 如何从操作符new或mremap的malloc中获取页对齐内存
- 新 char[] 产生对齐内存的标准要求C++背后的意图是什么?
- 未对齐内存访问:它是定义的行为或不
- 在c++中声明、操作和访问未对齐内存
- c++ 11中的动态对齐内存分配