找到主机可见内存的正确对齐

时间:2017-06-03 09:57:36

标签: vulkan

  

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

1 个答案:

答案 0 :(得分:5)

规范中没有任何内容限制分配的大小。您引用的段落意味着映射将与minMemoryMapAlignment对齐,然后您可以告诉编译器在访问时使用对齐的内存访问。会发生什么事情,当映射内存时,后来的48个字节是主机内存空间中浪费的空间。但这不太重要。

这就是人们继续说要分配更大的块并根据需要细分它们的原因。这样你可以将其中4个vkBuffers放入一个64字节的分配中(如果你想管道渲染,你需要这样做。)

单个vec3是你唯一需要记忆的东西,所以请看看你的其他分配,看看你可以合并哪些。