VK_NULL_HANDLE 的 Vulkan DestroyInstance / DestroyDevice
Vulkan DestroyInstance / DestroyDevice with VK_NULL_HANDLE
我的印象是您可以在 NULL 句柄上调用 Destroy / Free,这将是一个空操作。
2.5.1 Valid Usage
It is valid to pass VK_NULL_HANDLE to any vkDestroy* or vkFree* command, which will silently ignore these values.
但是,如果您使用 vkGetInstanceProcAddr 和 vkGetDeviceProcAddr 来获取函数指针,会发生什么情况?我正在执行以下操作:
Device::Device(Device&& other) :
handle(other.handle),
functions(other.functions)
{
other.handle = VK_NULL_HANDLE;
}
当然,当为原始设备调用析构函数时,它会将空句柄传递给特定于设备的 vkDestroyDevice.
目前,这给了我读取访问冲突,我不确定这是 AMD 的错、LunarG 的错还是我的错。
这是一个驱动程序错误。
可分派句柄(又名:指针)和不可分派句柄(又名:整数)之间存在区别。 NDH是那种可以存储VK_NULL_HANDLE
.
的句柄
请注意 vkDestroyDevice
的 "Valid Usage" 部分如何谈论设备可能是 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
的 "Valid Usage" 部分包含此语句:
- If
device
is not NULL
, device
must be a valid VkDevice
handle
这里的条件明确要求device
确实可以NULL
。因此,如果执行此操作时某个实现崩溃,则说明该实现存在问题。
我的印象是您可以在 NULL 句柄上调用 Destroy / Free,这将是一个空操作。
2.5.1 Valid Usage
It is valid to pass VK_NULL_HANDLE to any vkDestroy* or vkFree* command, which will silently ignore these values.
但是,如果您使用 vkGetInstanceProcAddr 和 vkGetDeviceProcAddr 来获取函数指针,会发生什么情况?我正在执行以下操作:
Device::Device(Device&& other) :
handle(other.handle),
functions(other.functions)
{
other.handle = VK_NULL_HANDLE;
}
当然,当为原始设备调用析构函数时,它会将空句柄传递给特定于设备的 vkDestroyDevice.
目前,这给了我读取访问冲突,我不确定这是 AMD 的错、LunarG 的错还是我的错。
这是一个驱动程序错误。
可分派句柄(又名:指针)和不可分派句柄(又名:整数)之间存在区别。 NDH是那种可以存储VK_NULL_HANDLE
.
请注意 vkDestroyDevice
的 "Valid Usage" 部分如何谈论设备可能是 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
的 "Valid Usage" 部分包含此语句:
- If
device
is notNULL
,device
must be a validVkDevice
handle
这里的条件明确要求device
确实可以NULL
。因此,如果执行此操作时某个实现崩溃,则说明该实现存在问题。