Vulkan 中 memoryTypes 的含义

Meaning of memoryTypes in Vulkan

我使用了 Vulkan 函数 vkGetPhysicalDeviceMemoryProperties 来获取特定物理设备(即 GPU)的内存属性。

我已经打印出这个函数的返回值(左起第一列是它们的枚举值。根据这个输出,我可以看到有 2 个内存堆和 11 个内存类型。

  Memory:
  -memoryTypeCount: 11
  -memoryTypes[VK_MAX_MEMORY_TYPES]:
    -0, propertyFlags: 0, heapIndex: 1
    -1, propertyFlags: 0, heapIndex: 1
    -2, propertyFlags: 0, heapIndex: 1
    -3, propertyFlags: 0, heapIndex: 1
    -4, propertyFlags: 0, heapIndex: 1
    -5, propertyFlags: 0, heapIndex: 1
    -6, propertyFlags: 0, heapIndex: 1
    -7, propertyFlags: 1, heapIndex: 0
    -8, propertyFlags: 1, heapIndex: 0
    -9, propertyFlags: 6, heapIndex: 1
    -10, propertyFlags: 14, heapIndex: 1
  -memoryHeapCount: 2
  -memoryHeaps[VK_MAX_MEMORY_HEAPS]:
    -0, size: 6442450944, flags: 1
    -1, size: 25186016256, flags: 0

问题:

  1. propertyFlags=0 是什么意思?我在 Vulkan 规范中找不到它。
  2. heapIndex=0 和 1 指的是 memoryHeaps 的第一个还是第二个元素?
  3. 拥有多个 memoryTypes 元素有什么好处?我如何在 Vulkan 应用程序中使用它们?

What does propertyFlags=0 means? I can't find it in Vulkan specification.

这正是 the Vulkan specification says that it means 的意思。此内存类型:

  • 不是DEVICE_LOCAL,所以不代表快速的设备访问。
  • 不是 HOST_VISIBLE,因此您不能直接从 CPU.
  • 读取 from/write 到它

这是一种内存类型,表示您无法直接访问的内存分配,GPU 也不会最快访问。

Does heapIndex=0 and 1 refers to the 1st or 2nd element of memoryHeaps?

Vulkan 基于 C and/or C++ 构建。所有数组都是从零开始的。所以 heapIndex 0 指的是 memoryHeap 数组中的初始元素。

What is the advantage of having multiple memoryTypes element? How do I use them in a Vulkan application?

Vulkan 是一个显式的低级 API。这意味着您需要就您的应用程序如何处理事情做出明智的决定。你问硬件有什么可用,你调整你的应用程序以适应硬件的各种特性。

各种内存类型。这些控制您访问该内存的方式,以及描述 GPU 访问它的速度是快还是慢。对于内存的特定用途,您必须 select 最适合该用途的内存类型。

当然,还有一个事实是缓冲区和图像对它们可以分配的内存类型有限制。这些限制基于这些对象的使用类型(以及图像格式)。因此,您需要预先检查可以通过哪些内存类型分配您打算使用的缓冲区和图像。

现在,为什么你的实现有多个相同内存类型的副本(具有相同标志和内存堆字段的内存类型),我不知道。