使用VK_NULL_HANDLE的Vulkan DestroyInstance / DestroyDevice

时间:2016-04-11 23:53:19

标签: c++ vulkan

我的印象是你可以在一个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的错,还是我的错。

1 个答案:

答案 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。因此,如果执行时实现崩溃,那么实现就会出现问题。