我使用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
问题:
答案 0 :(得分:0)
propertyFlags = 0是什么意思?我在Vulkan规范中找不到它。
这正是the Vulkan specification says that it means的意思。这种记忆类型:
这是一种代表无法直接访问的内存分配的内存类型,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是否可以快速或慢速访问它。对于内存的特定用途,您必须选择最适合该用途的内存类型。
当然,还有一个事实是缓冲区和图像限制了它们可以分配的内存类型。这些限制基于这些对象的使用类型(以及图像格式)。因此,您需要预先检查您打算使用的缓冲区和图像的内存类型。
现在,为什么你的实现有多个相同内存类型的副本(具有相同标志和内存堆字段的内存类型),我不知道。