Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Vukan DestroyInstance/DestroyDevice带有VK_NULL_句柄_C++_Vulkan - Fatal编程技术网

C++ Vukan DestroyInstance/DestroyDevice带有VK_NULL_句柄

C++ Vukan DestroyInstance/DestroyDevice带有VK_NULL_句柄,c++,vulkan,C++,Vulkan,我的印象是,你可以在一个空句柄上调用Destroy/Free,这将是一个禁止操作的命令 2.5.1有效用法 将VK_NULL_句柄传递给任何vkDestroy*或vkFree*命令都是有效的,该命令将自动忽略这些值 但是如果使用vkGetInstanceProcAddr和vkGetDeviceProcAddr来获取函数指针,会发生什么呢?我正在做以下工作: Device::Device(Device&& other) : handle(other.handle),

我的印象是,你可以在一个空句柄上调用Destroy/Free,这将是一个禁止操作的命令

2.5.1有效用法

将VK_NULL_句柄传递给任何vkDestroy*或vkFree*命令都是有效的,该命令将自动忽略这些值

但是如果使用vkGetInstanceProcAddr和vkGetDeviceProcAddr来获取函数指针,会发生什么呢?我正在做以下工作:

Device::Device(Device&& other) :
    handle(other.handle),
    functions(other.functions)
{
    other.handle = VK_NULL_HANDLE;
}
当然,当为原始设备调用析构函数时,它会将一个空句柄传递给特定于设备的vkDestroyDevice

目前,这给了我一个读访问冲突,我不确定这是AMD的错误,LunarG的错误,还是我的错误。

这是一个驱动程序错误

可调度句柄(又名:指针)和不可调度句柄(又名:整数)之间有区别。NDH是一种可以存储
VK\u NULL\u句柄的句柄

请注意,
vkDestroyDevice
的“有效使用”部分如何讨论设备可能为
NULL
,而
vkDestroyCommandBufferPool
如何讨论池可能为
VK\u NULL\u句柄
。因此,规范明确规定了这一区别

这意味着2.5.1中的语句不是指采用可调度句柄的
vkDestroy*
函数。毕竟,它们不能假定值
VK\u NULL\u HANDLE

当然,
VK\u NULL\u HANDLE
恰好被定义为0。在C++中,整数文字0也加倍为空指针常数。这意味着:

VkDevice dev = VK_NULL_HANDLE;
这是完全合法的。即使Vulkan规范并不要求这是有意义的

然而,所有这些都无关紧要。为什么?因为
vkDestroyDevice
的“有效使用”部分包含以下语句:

  • 如果
    device
    不是
    NULL
    device
    必须是有效的
    VkDevice
    句柄

这里的条件明确要求
设备
确实可以为
。因此,如果您这样做时某个实现发生崩溃,那就是该实现的问题。

*2.6.1在最新的规范中,随着崩溃的发生,尝试调用
vkDelete*
上的
VK_NULL_HANDLE
,使用
VK_LAYER\u LUNARG\u standard\u validation
,也会出现验证错误。错误:[OBJTRACK]:VkImage对象0x0无效。错误:[OBJTRACK]:无法删除obj 0x0。它是创建的吗?它已经被摧毁了吗?因此,这似乎也是验证层(v1.0.8)中的一个bug。我在LunarG站点上发布了一个bug报告,并在1.0.11版本中得到了解决。