Vulkan中memoryTypes的含义

时间:2017-06-05 10:23:58

标签: vulkan

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

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

  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应用程序中使用它们?

1 个答案:

答案 0 :(得分:0)

  

propertyFlags = 0是什么意思?我在Vulkan规范中找不到它。

这正是the Vulkan specification says that it means的意思。这种记忆类型:

  • 不是DEVICE_LOCAL,因此它不代表快速设备访问。
  • 不是HOST_VISIBLE,因此您无法直接从CPU读取/写入。

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

  

heapIndex = 0和1是否指向memoryHeaps的第一个或第二个元素?

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

  

拥有多个memoryTypes元素有什么好处?如何在Vulkan应用程序中使用它们?

Vulkan是一个明确的低级API。这意味着您需要就应用程序如何处理事情做出明智的决定。您询问硬件可用的内容,并根据硬件的各种功能调整应用程序。

各种内存类型tell you the ways in which you can allocate memory from various heaps。它们控制着如何访问内存,以及描述GPU是否可以快速或慢速访问它。对于内存的特定用途,您必须选择最适合该用途的内存类型。

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

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