Vulkan规范(1.0.12)在2.4节中引入了VkDeviceSize:
但是,它永远不会告诉我们VkDeviceSize的底层类型实际上是什么。我们应该如何知道在VkDeviceSize和size_t之间转换是否安全?
从SDK随附的 header 中,我看到它已类型定义为uint64_t。在将来的任何时候,这种情况改变的可能性有多大?
最佳答案
请注意,Vulkan规范未指定例如其任何枚举器的值。为什么?因为它们是在vk.xml
中指定的,所以它用于生成vulkan.h
。VkDeviceSize
也是如此。就像Vulkan定义的所有其他类型一样。
是的,OpenGL规范为其各种类型指定了特定的大小。但是Vulkan不需要,也不必这样做。
不安全的唯一方法是,如果满足以下条件之一:
size_t
类型的值对于VkDeviceSize
太大。 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似乎将向后兼容性定义为二进制兼容性,而不是源代码兼容性:这表明该应用程序无需重新编译即可运行。
因此,唯一的
VkDeviceSize
更改时间将是主要版本更改。如果发生这种情况,那么就兼容性而言,所有赌注都将落空。因此,诸如更改该大小之类的小事情可能是无关紧要的。