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

Mai*_*ein 3 vulkan

ppData指向一个指针,在该指针中返回了主机可访问的指向映射范围开头的指针。该指针减去偏移量必须至少与VkPhysicalDeviceLimits :: minMemoryMapAlignment对齐。

我想在统一缓冲区中分配Vec3浮点数。Vec3浮点数为12个字节。

VkMemoryRequirements { size: 16, alignment: 16, memory_type_bits: 15 }
Run Code Online (Sandbox Code Playgroud)

Vulkan报告必须将其对齐为16个字节,这意味着分配的大小现在为16而不是12。因此Vulkan已经为我处理了这个问题。

minMemoryMapAlignment我的GPU上是64字节。这对我的分配究竟意味着什么?这是否意味着我不能使用a的大小VkMemoryRequirements进行分配?而不是在这里分配16bytes,我必须分配64bytes吗?

更新:

对于12字节分配,其中16字节对齐和64字节minMemoryMapAlignment。我仍然只分配16个字节,然后调用:

vkMapMemory(device, memory, 0, 16, 0, &mapped);
Run Code Online (Sandbox Code Playgroud)

但是返回的ptr vkMapMemory实际上不是16字节而是64字节宽吗?并且所有相关数据都在前12个字节中,其余只是“填充”内存?因此,实际上,这基本上意味着我根本不需要使用minMemoryMapAlignment

rat*_*eak 5

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

这就是为什么人们一直说要分配更大的块并根据需要对其进行细分的原因。这样,您可以将这些vkBuffer中的4个放入单个64字节的分配中(如果您希望通过管线传递呈现,则需要此分配)。

单个vec3不太可能是您唯一需要的内存,因此请查看其他分配并查看可以组合的分配。