Graphics Vulkan能否释放从另一个API导入到Vulkan的内存?

Graphics Vulkan能否释放从另一个API导入到Vulkan的内存?,graphics,vulkan,Graphics,Vulkan,在POSIX系统上,可以使用VkImportMemoryFdInfoKHR通过文件描述符从其他API导入内存对象(在Windows上使用VkImportMemoryWin32HandleInfoKHR也可以类似地工作)。导入内存对象后,Vulkan是否可以使用vkfreemory释放底层内存,或者只能通过分配内存的API释放内存?谢谢你的帮助 Vulkan不仅仅允许释放VkDeviceMemory对象;它必须这样做。当您将内存导入Vulkan时,规范清楚地表明Vulkan现在拥有该句柄: 从文件

在POSIX系统上,可以使用
VkImportMemoryFdInfoKHR
通过文件描述符从其他API导入内存对象(在Windows上使用
VkImportMemoryWin32HandleInfoKHR
也可以类似地工作)。导入内存对象后,Vulkan是否可以使用
vkfreemory
释放底层内存,或者只能通过分配内存的API释放内存?谢谢你的帮助

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

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

因此,您不允许在该文件描述符上再使用常规命令。Vulkan拥有它,对它调用
vkfreemory
不是可选的:

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

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


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

我不清楚规范中的摘录如何说明Vulkan是释放内存所必需的。据我所知,它只是说,在导入内存后,您不允许对文件描述符做任何事情(例如,对其调用
close()
),因为Vulkan现在拥有文件描述符,但不一定拥有内存。@malte-v:因为您必须释放分配的所有
VkDeviceMemory
对象。对于导入的内存没有特殊的例外,我不能引用一个不存在的东西。好吧,如果您从另一个API导入内存,您不会分配它,对吗?或者它是复制的而不是共享的?@malte-v:您用来导入它的函数字面上叫做
vkallocatemory
。我再次查看了VK_KHR_外部内存,它说:“应用程序可能希望在多个Vulkan逻辑设备或实例、多个进程和/或多个API中引用设备内存。此扩展使应用程序能够从Vulkan内存对象导出非Vulkan句柄,从而可以在创建它们的Vulkan逻辑设备的作用域之外引用底层资源。因此,导入时不会复制内存,也不会分配新内存。我认为他们只是重用了
vkallocatemory
,没有引入新功能。