为什么 Vulkan 规范没有定义 VkDeviceSize?

Why doesn't the Vulkan spec define VkDeviceSize?

Vulkan 规范 (1.0.12) 在 2.4 节中介绍了 VkDeviceSize:

With few exceptions, Vulkan uses the standard C types for parameters (int types from stdint.h, etc). Exceptions to this are using VkResult for return values, using VkBool32 for boolean values, VkDeviceSize for sizes and offsets pertaining to device address space, and VkFlags for passing bits or sets of bits of predefined values.

但是,它从未告诉我们 VkDeviceSize 的底层类型到底是什么。我们怎么知道在 VkDeviceSize 和 size_t 之间转换是否安全?

从 SDK 提供的 headers 中,我看到它被类型定义为 uint64_t。在未来的任何时候,这种情况发生变化的可能性有多大?

Why doesn't the Vulkan spec define VkDeviceSize?

请注意,例如,Vulkan 规范未指定其任何枚举​​器的值。为什么?因为它们在 vk.xml 中指定,用于生成 vulkan.h.

VkDeviceSize也是如此。正如它对 Vulkan 定义的所有其他类型所做的那样。

是的,OpenGL 规范为其各种类型指定了特定尺寸。但是 Vulkan 没有,也没有必要。

How are we supposed to know whether it is safe to convert between a VkDeviceSize and a size_t?

唯一不安全的方式是以下情况之一:

  1. 您要转换的类型 size_t 的值对于 VkDeviceSize 来说太大了。

  2. 您要转换的 VkDeviceSize 的值对于 size_t 来说太大了。

嗯,你指定 VkDeviceSize 的绝大多数地方最终都来自对 vkAllocateMemory 的调用(映射偏移量,buffer/image 创建等,都是基于块你分配的内存)。因此,如果您要提供无法放入 VkDeviceSizesize_t,那么...那是什么意思?

很明显,这意味着您打算分配的内存量必须大于实现提供的内存量。毕竟,内存限制本身由 VkDeviceSize 指定。因此,如果您的 size_t 太大而无法适应该类型,那么您 必须 尝试分配比现有内存更多的内存。

我会说这是一个比整数转换不起作用更大的问题。

#2 主要对 vkGetPhysicalDeviceMemoryProperties 很重要。如果 size_t 太小而无法存储您从中返回的值...等等,您为什么要使用 size_t 来存储这些值?有什么原因你不能使用值的实际类型,VkDeviceSize?

How likely is it that this would change, at any point in the future?

这或多或少无关紧要。为什么?由于 Vulkan 已经具有兼容性保证。

根据规范,Vulkan 的次要版本不能进行不向后兼容的更改。如果您编写的代码适用于 Vulkan 1.0,那么它也必须适用于 Vulkan 1.1。和 1.2。等等。

如果 VkDeviceSize 在不同版本之间发生变化,则必须(至少)重新编译代码以修复它。而且 Vulkan 似乎将向后兼容性定义为二进制兼容性,而不是源代码兼容性:

A given version of the API is backwards compatible with an earlier version if an application, relying only on valid behavior and functionality defined by the earlier specification, is able to correctly run against each version without any modification.

这表明应用程序无需重新编译即可工作。

所以唯一一次 VkDeviceSize 会改变的是主要版本的变化。如果发生这种情况,就兼容性而言,所有的赌注都会落空。所以像改变大小这样的小事可能无关紧要。

它在vk.xml中定义(如uint64_t)。其官方状态的规格引用:

The canonical definition of the Vulkan APIs is kept in an XML file known as the Vulkan registry. The registry is kept in src/spec/vk.xml[...]

它现在已经相当扎根了,你不能指望它在 1.0.X 补丁版本中发生变化(尽管到目前为止已经发生了一些小的(可以说是)破坏性变化,虽然它是新的)

您可以使用 sizeof() 运算符查询它。你也不知道 size_t 的大小。