首页 > 解决方案 > Vulkan 可以释放从另一个 API 导入到 Vulkan 的内存吗?

问题描述

在 POSIX 系统上,可以使用文件描述符从其他 API 导入内存对象VkImportMemoryFdInfoKHR(在 Windows 上使用类似VkImportMemoryWin32HandleInfoKHR)。导入内存对象后,是否允许 Vulkan 使用 释放底层内存vkFreeMemory,还是只能由分配它的 API 释放内存?谢谢您的帮助!

标签: graphicsvulkan

解决方案


Vulkan 不仅被允许释放VkDeviceMemory对象;必须这样做。当您将内存导入 Vulkan 时,规范清楚地表明 Vulkan 现在拥有该句柄:

从文件描述符导入内存会将文件描述符的所有权从应用程序转移到 Vulkan 实现。成功导入后,应用程序不得对文件描述符执行任何操作。

因此,您不再可以在该文件描述符上使用常规命令。Vulkan 拥有它,并且调用vkFreeMemory它不是可选的:

VkDevice 对象可以在从它们检索到的所有 VkQueue 对象都空闲并且从它们创建的所有对象都被销毁时被销毁。这包括以下对象:

...

  • 虚拟设备内存

VkDeviceMemory作为内存导入操作的结果分配的对象也不例外。

当然,现在您可以在恰好与同一内存通信的不同 FD 上执行操作(您甚至可以vkGetMemoryFdKHR这样做)。但是您导入的特定 FD 将归 Vulkan 所有。释放内存释放文件描述符;它不会影响内存本身。


推荐阅读