为什么vkGetPhysicalDeviceMemoryProperties返回多个相同的内存类型?

因此,我在初始化期间收集有关我的设备的一些信息,并找到vkGetPhysicalDeviceMemoryProperties返回的唯一(或更确切地说,非常相似)内存类型集:

Device Name: GeForce GTX 1060 3GB Device ID: 7170 Device Type: 2 Device Vendor ID: 4318 Device API Version: 4194369 (1.0.65) Device Driver Version: 1636843520 (390.65) Device Heaps: 0 -> Size: 3133145088 Flags: 1 1 -> Size: 8523874304 Flags: 0 Device Memory: 0 -> Index: 1 Flags: 0 1 -> Index: 1 Flags: 0 2 -> Index: 1 Flags: 0 3 -> Index: 1 Flags: 0 4 -> Index: 1 Flags: 0 5 -> Index: 1 Flags: 0 6 -> Index: 1 Flags: 0 7 -> Index: 0 Flags: 1 8 -> Index: 0 Flags: 1 9 -> Index: 1 Flags: 6 10 -> Index: 1 Flags: 14 

我坐下来思考……我应该选择哪一个? 排除七个相同的主机本地内存类型,我们仍然有两个相同的设备内存类型。 这一定有一些原因,所以我通过互联网的深处探索我的冒险!

StackOverflow似乎没有任何类似的东西,谷歌从Nvidia返回一些似乎没有广泛涉及内存类型的官方文档,所以也许Vulkan文档有多少东西? vkGetPhysicalDeviceMemoryProperties , VkPhysicalDeviceMemoryProperties和VkMemoryType似乎没有提供有关多个相同内存类型主题的任何有见地的信息。 也许官方的Vulkan编程指南 (其源代码仍然没有被发布)可以触及这个主题? 不幸的是,似乎我的快速浏览引导我进入第10页,其中似乎没有提及任何有关相同内存类型的内容(但是在它确实提到相同的队列系列之后的队列部分)。

为什么我会得到多种内存类型,更重要的是我应该选择哪种? 如果我想像分配队列一样分配多个缓冲区,我应该交替使用不同的类型吗?

就Vulkan规范而言:

  • VkMemoryRequirements::memoryTypeBits告诉您可以使用哪些类型
  • 如果是相同的内存类型标志,则应按性能对它们进行排序

因此,最佳/预期的做法是:

1)确定您想要/需要哪些标志。
2)进一步使用VkMemoryRequirements::memoryTypeBits允许的类型过滤列表
3)如果有任何类型,请选择第一个。 (或者从步骤1开始,标记更少。)

Vulkan不一定知道(和报告)一切。 但只要你坚持上述你应该没事。

什么是你的Vulkan记忆类型? NVIDIA文章似乎描述了主机 – 本地类型的情况:

在OpenGL或DirectX 11中,驱动程序传统上一直支持应用程序的资源分配,方法是在设备内存超额配置的情况下在设备本地和系统内存之间移动资源,如果用户可能选择超出可用数量的图像质量设置,则会发生这种情况。设备本地内存。

[…]

为了实现这一点,我们公开了其他主机本地内存类型:

  • 缓冲区的内存类型
  • 任何格式的彩色图像的存储器类型
  • 为系统存储器中的每种深度/模板格式分别设置深度/模板图像的存储器类型

数学似乎检查:1(对于缓冲区)+ 1(对于图像)+ 5(这似乎匹配此GPU上支持的深度格式)= 7。

我希望设备本地类型有类似的理由。 猜测:可能是一个用于深度资源,一个用于图像和缓冲区。