我的印象是你可以在一个NULL句柄上调用Destroy / Free,这将是一个无操作。
2.5.1有效使用
将VK_NULL_HANDLE传递给任何vkDestroy *或vkFree *命令是有效的,它会默默地忽略这些值。
但是如果您使用 vkGetInstanceProcAddr 和 vkGetDeviceProcAddr 来获取函数指针会发生什么?我正在做以下事情:
Device::Device(Device&& other) :
handle(other.handle),
functions(other.functions)
{
other.handle = VK_NULL_HANDLE;
}
当然,当为原始设备调用析构函数时,它会将null句柄传递给特定于设备的 vkDestroyDevice 。
目前,这给了我一个读访问权限,我不确定这是AMD的错,LunarG的错,还是我的错。
答案 0 :(得分:4)
这是一个驱动程序错误。
可调度句柄(aka:指针)和不可调度句柄(aka:整数)之间存在区别。 NDH是可以存储VK_NULL_HANDLE
的句柄。
请注意vkDestroyDevice
的“有效使用情况”部分如何讨论该设备可能是NULL
,而vkDestroyCommandBufferPool
谈论该池可能是VK_NULL_HANDLE
。因此,规范明确区分了这一点。
这意味着2.5.1中的语句并不是指引用可调度句柄的vkDestroy*
函数。毕竟,他们不能假设值VK_NULL_HANDLE
。
当然,VK_NULL_HANDLE
碰巧被定义为0.而在C ++中,整数文字0也兼作空指针常量。这意味着:
VkDevice dev = VK_NULL_HANDLE;
完全合法。尽管Vulkan规范并不需要这是有道理的。
然而,所有这些都无关紧要。为什么?因为vkDestroyDevice
的“有效用法”部分包含此声明:
- 如果
device
不是NULL
,则device
必须是有效的VkDevice
句柄
此处的条件显然要求device
确实可以NULL
。因此,如果执行时实现崩溃,那么实现就会出现问题。