5

The Vulkan specification (1.0.12) introduces VkDeviceSize in section 2.4:

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.

However, it never tells us what the underlying type of VkDeviceSize actually is. How are we supposed to know whether it is safe to convert between a VkDeviceSize and a size_t?

From the headers provided with the SDK, I see that it is typedef'ed to uint64_t. How likely is it that this would change, at any point in the future?

4

2 回答 2

6

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

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

也一样VkDeviceSize。就像它对 Vulkan 定义的所有其他类型一样。

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

VkDeviceSize我们应该如何知道在 a和 a之间转换是否安全size_t

唯一不安全的方法是以下情况之一为真:

  1. size_t您要转换的类型的值对于VkDeviceSize.

  2. VkDeviceSize您要转换的值对于size_t.

好吧,您指定的绝大多数地方VkDeviceSize最终都来自调用vkAllocateMemory(映射偏移量、缓冲区/图像创建等,所有这些都基于您分配的内存块)。因此,如果您要提供一个size_t不适合的VkDeviceSize,那么...这是什么意思?

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

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

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

在未来的任何时候,这种情况发生变化的可能性有多大?

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

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

如果VkDeviceSize在版本之间进行更改,则必须(至少)重新编译自己的代码来修复它。Vulkan 似乎将向后兼容性定义为二进制兼容性,而不是源兼容性:

如果应用程序仅依赖于早期规范定义的有效行为和功能,能够在不进行任何修改的情况下正确运行每个版本,则 API 的给定版本向后兼容早期版本。

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

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

于 2016-04-30T05:55:21.413 回答
2

它在 vk.xml 中定义(作为 uint64_t)。其官方状态的规格报价:

Vulkan API 的规范定义保存在称为 Vulkan 注册表的 XML 文件中。注册表保存在 src/spec/vk.xml[...]

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

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

于 2016-05-01T00:20:20.000 回答