ppData指向一个返回主机可访问的指针 指向映射范围开头的指针。这个指针减去 offset必须至少对齐 VkPhysicalDeviceLimits :: minMemoryMapAlignment。
我想在统一缓冲区中分配一个Vec3浮点数。 Vec3浮动大12字节。
VkMemoryRequirements { size: 16, alignment: 16, memory_type_bits: 15 }
Vulkan报告它必须与16个字节对齐,这意味着分配的大小现在是16而不是12.所以Vulkan已经为我处理了这个。
我的GPU上的 minMemoryMapAlignment
是64字节。这究竟对我的分配意味着什么?这是否意味着我无法使用VkMemoryRequirements
的大小来进行分配?而不是在这里分配16字节,我将不得不分配64字节?
更新
对于12字节分配,16字节对齐和64字节minMemoryMapAlignment
。我仍然只分配16个字节,然后调用:
vkMapMemory(device, memory, 0, 16, 0, &mapped);
但是从vkMapMemory
返回的ptr实际上不是16字节而是宽64字节?并且所有相关数据都在前12个字节中,其余的只是"填充"记忆?所以在实践中这基本上意味着我根本不需要使用minMemoryMapAlignment
?
答案 0 :(得分:5)
规范中没有任何内容限制分配的大小。您引用的段落意味着映射将与minMemoryMapAlignment
对齐,然后您可以告诉编译器在访问时使用对齐的内存访问。会发生什么事情,当映射内存时,后来的48个字节是主机内存空间中浪费的空间。但这不太重要。
这就是人们继续说要分配更大的块并根据需要细分它们的原因。这样你可以将其中4个vkBuffers放入一个64字节的分配中(如果你想管道渲染,你需要这样做。)
单个vec3是你唯一需要记忆的东西,所以请看看你的其他分配,看看你可以合并哪些。