Vulkan 的 VkMemoryHeapFlagBits 是否缺少值?

Is Vulkan's VkMemoryHeapFlagBits missing values?

在 Vulkan 规范 1.0.9(第 180 页)中,我们有以下内容:

typedef struct VkMemoryHeap {
  VkDeviceSize size;
  VkMemoryHeapFlags flags;
} VkMemoryHeap;

和这个描述:

• size is the total memory size in bytes in the heap.

• flags is a bitmask of attribute flags for the heap. The bits specified in flags are:

typedef enum VkMemoryHeapFlagBits {
VK_MEMORY_HEAP_DEVICE_LOCAL_BIT = 0x00000001,
} VkMemoryHeapFlagBits;

但是当我查询 VkPhysicalDeviceMemoryProperties 时,我得到了零值的标志。我的代码与 Vulkan SDK vkjson_info.exe 工具的输出相匹配,该工具输出一个 JSON 文件,其中包含我的 GPU 的属性。

这里是不是少了什么?

没有。 VkMemoryHeap::flags 为 0 是完全有效的。一个特定的标志要么存在要么不存在;它不是一个枚举,其中的值可以达到少数不同可能性中的一种。通常,标志是相互独立的。

这就是位标志的工作原理;它们代表布尔条件。特定标志存在或不存在。如果存在标志,则对象获得标志定义的含义。如果不存在,则对象 没有 的含义。

具有 VK_MEMORY_HEAP_DEVICE_LOCAL_BIT 的堆的含义与规范中的含义完全相同:"the heap corresponds to device local memory"。没有设置该标志的堆意味着堆 "correspond to device local memory".

规范要求至少 一个堆设置此标志。但仅此而已。