【发布时间】:2019-12-22 13:38:12
【问题描述】:
在 POSIX 系统上,可以使用 VkImportMemoryFdInfoKHR 通过文件描述符从其他 API 导入内存对象(在 Windows 上使用 VkImportMemoryWin32HandleInfoKHR 的工作方式类似)。导入内存对象后,是否允许 Vulkan 使用 vkFreeMemory 释放底层内存,还是只能由分配它的 API 释放内存?感谢您的帮助!
【问题讨论】:
在 POSIX 系统上,可以使用 VkImportMemoryFdInfoKHR 通过文件描述符从其他 API 导入内存对象(在 Windows 上使用 VkImportMemoryWin32HandleInfoKHR 的工作方式类似)。导入内存对象后,是否允许 Vulkan 使用 vkFreeMemory 释放底层内存,还是只能由分配它的 API 释放内存?感谢您的帮助!
【问题讨论】:
Vulkan 不仅可以释放VkDeviceMemory 对象; 必须这样做。当您将内存导入 Vulkan 时,规范很清楚 Vulkan 现在拥有该句柄:
从文件描述符导入内存会将文件描述符的所有权从应用程序转移到 Vulkan 实现。成功导入后,应用程序不得对文件描述符执行任何操作。
因此,您不再可以在该文件描述符上使用常规命令。 Vulkan 拥有它,并且在其上调用 vkFreeMemory 不是可选的:
VkDevice 对象可以在从它们检索到的所有 VkQueue 对象都处于空闲状态时被销毁,并且从它们创建的所有对象都已被销毁。这包括以下对象:
...
- VkDeviceMemory
作为内存导入操作的结果分配的 VkDeviceMemory 对象也不例外。
当然,您可以在恰好与同一内存通信的不同 FD 上执行操作(您甚至可以使用 vkGetMemoryFdKHR 来执行此操作)。但是您导入的特定 FD 将归 Vulkan 所有。释放内存释放文件描述符;它不会影响内存本身。
【讨论】:
close()),因为 Vulkan 现在拥有 文件描述符,但不一定是内存。
VkDeviceMemory 对象。导入的内存没有什么特殊的例外,不存在的东西我不能引用。
vkAllocateMemory。
vkAllocateMemory 而不是引入新功能。