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

And*_*son 4 vulkan

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

除了少数例外,Vulkan使用参数的标准C类型(来自stdint.h的int类型等).例外情况是使用VkResult作为返回值,使用VkBool32作为布尔值,使用VkDeviceSize作为与设备地址空间有关的大小和偏移,使用VkFlags作为传递预定义值的位或位组.

但是,它从未告诉我们VkDeviceSize的基本类型实际上是什么.我们怎么知道在VkDeviceSize和size_t之间转换是否安全?

从随SDK提供的标头中,我看到它是uint64_t的typedef.在未来的任何时候,这种情况有多大可能发生变化?

Nic*_*las 6

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

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

同样如此VkDeviceSize.就像Vulkan定义的所有其他类型一样.

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

我们怎么知道在a VkDeviceSize和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会改变主要版本更改.如果发生这种情况,就兼容性而言,所有赌注都会被取消.所以改变这个尺寸的小事可能是无关紧要的.