【问题标题】:Can memory imported to Vulkan from another API be freed by Vulkan?Vulkan 可以释放从另一个 API 导入到 Vulkan 的内存吗?
【发布时间】:2019-12-22 13:38:12
【问题描述】:

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

【问题讨论】:

    标签: graphics vulkan


    【解决方案1】:

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

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

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

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

    ...

    • VkDeviceMemory

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

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

    【讨论】:

    • 我不清楚规范中的摘录是如何规定需要 Vulkan 来释放内存的。据我了解,它只是说您在导入内存后不允许对 文件描述符 做任何事情(例如,在其上调用 close()),因为 Vulkan 现在拥有 文件描述符,但不一定是内存
    • @malte-v:因为您必须释放您分配的所有VkDeviceMemory 对象。导入的内存没有什么特殊的例外,不存在的东西我不能引用。
    • 好吧,如果你从另一个 API 导入内存,你不会分配它,对吧?还是复制而不是共享?
    • @malte-v:你用来导入它的函数字面意思是vkAllocateMemory
    • 我再次查看了 VK_KHR_external_memory,它说:“应用程序可能希望在多个 Vulkan 逻辑设备或实例、多个进程中引用设备内存,并且/ 或在多个 API 中。此扩展使应用程序能够从 Vulkan 内存对象导出非 Vulkan 句柄,以便可以在 Vulkan 逻辑范围之外引用 基础资源创造它们的设备。”因此,内存在导入时不会重复,也没有分配新的内存。我认为他们只是重用了vkAllocateMemory 而不是引入新功能。
    猜你喜欢
    • 2021-11-29
    • 2018-07-15
    • 1970-01-01
    • 2023-03-17
    • 2021-08-23
    • 2018-01-09
    • 1970-01-01
    • 2020-06-25
    • 2016-10-30
    相关资源
    最近更新 更多