什么时候应该释放从另一个 API 导入到 Vulkan 的 VkDeviceMemory 对象?
When should VkDeviceMemory objects imported to Vulkan from another API be freed?
请注意,这主要是此 post 的后续问题:Can memory imported to Vulkan from another API be freed by Vulkan?(无需阅读即可理解问题,尽管如此可能很有趣)
可以使用 VK_KHR_external_memory*
系列扩展将内存对象从其他 API 导入 Vulkan。正如@Nicol Bolas 在之前 post 中所解释的,所有内存对象都需要在销毁 VkDevice
之前被释放,无论它们是否被导入。有两个选项我可以想到释放导入的内存对象时会发生什么:
- 当调用
vkFreeMemory
时,给定的区域被全局释放(如函数名称所示)并且可以在调用后被任何应用程序使用
- 驱动程序知道内存对象已导入并且可能正在被另一个应用程序使用,因此内存区域未标记为可用
我认为假设 2 是正确的,但如果是这样,函数名称 vkFreeMemory
就会产生误导。我在规范中找不到关于此的任何信息,所以我想我会在这里问一下。
Import pNext
结构将 vkAllocateMemory
语义更改为导入操作。常识意味着 vkFreeMemory
受到同样的影响。 IE。它只是取消导入内存。这样你也不会破坏其他 API 的 OO 设计。简单地说,(真正)分配内存的 API 也将取消分配它。
如果你是一名训练有素的工程师,直接阅读规范,仍然不明白,很可能你不是唯一的。如果您在 KhronosGroup/Vulkan-Docs 报告此类事情,我会更愿意(如果您愿意,他们甚至会接受补丁)。这样它就会为每个人修复。
请注意,这主要是此 post 的后续问题:Can memory imported to Vulkan from another API be freed by Vulkan?(无需阅读即可理解问题,尽管如此可能很有趣)
可以使用 VK_KHR_external_memory*
系列扩展将内存对象从其他 API 导入 Vulkan。正如@Nicol Bolas 在之前 post 中所解释的,所有内存对象都需要在销毁 VkDevice
之前被释放,无论它们是否被导入。有两个选项我可以想到释放导入的内存对象时会发生什么:
- 当调用
vkFreeMemory
时,给定的区域被全局释放(如函数名称所示)并且可以在调用后被任何应用程序使用 - 驱动程序知道内存对象已导入并且可能正在被另一个应用程序使用,因此内存区域未标记为可用
我认为假设 2 是正确的,但如果是这样,函数名称 vkFreeMemory
就会产生误导。我在规范中找不到关于此的任何信息,所以我想我会在这里问一下。
Import pNext
结构将 vkAllocateMemory
语义更改为导入操作。常识意味着 vkFreeMemory
受到同样的影响。 IE。它只是取消导入内存。这样你也不会破坏其他 API 的 OO 设计。简单地说,(真正)分配内存的 API 也将取消分配它。
如果你是一名训练有素的工程师,直接阅读规范,仍然不明白,很可能你不是唯一的。如果您在 KhronosGroup/Vulkan-Docs 报告此类事情,我会更愿意(如果您愿意,他们甚至会接受补丁)。这样它就会为每个人修复。