有没有办法在不覆盖实际分配的情况下使用 vulkan 内部分配回调?



当为 vkCreate* 函数指定 VkAllocationCallbacks 结构时,我想只使用 vulkan 通知而不覆盖真正的分配器,但我找不到方法。

从 https://www.khronos.org/registry/vulkan/specs/1.1-extensions/man/html/VkAllocationCallbacks.html

  • pfn分配必须是指向有效用户定义PFN_vkAllocationFunction的有效指针

  • pfn重新分配必须是指向有效用户定义PFN_vkReallocationFunction的有效指针

  • pfnFree 必须是指向有效用户定义PFN_vkFreeFunction的有效指针

  • 如果 pfnInternalAllocation 或 pfnInternalFree 中的任何一个不是 NULL,则两者都必须是有效的回调

对我来说,我不能只传递一个 nullptr 来使用默认分配似乎很奇怪,这有什么理由吗?

也许可以在运行时查询默认分配器,但我还没有找到任何方法,我很高兴知道是否可以以可移植的方式进行。

您可能没有完全理解这些函数集之间的区别。

第一组函数,即分配函数,被 Vulkan 用来分配 CPU 内存......大多数时候。另外两个函数(内部通知函数)适用于其他时间。

看,有时 Vulkan 实现需要进行特定于操作系统的系统调用来分配内存。Vulkan 规范承认这种情况:分配"可执行内存":包含 CPU 指令集操作码的内存。出于安全原因,操作系统不允许只执行随机内存地址;现代操作系统要求大多数应用程序以特殊方式分配内存,以便其可执行。因此:

由于跨多个平台的不同安全实现的复杂性,应用程序不应处理分配供主机执行的内存。实现将在内部分配此类内存,并在分配和释放这些内部分配时调用应用程序提供的信息回调。

正常的内存分配函数(如::operator newmalloc)无法做到这一点。Vulkan 规范也不期望客户端代码能够进行这些系统调用。

但是,客户端代码可能需要能够跟踪此类分配,以便它能够知道 Vulkan 实现保留了多少内存。因此,当进行/释放"内部分配"时,将调用内部通知函数。

这是唯一一次调用此类函数。

因此,如果您的目标只是跟踪何时进行/释放实施分配,那么仅靠内部通知功能将无法完成工作。您必须覆盖所有内容,这意味着您需要实际执行分配/重新分配/释放。

由于这似乎是不可能的,我将简单地使用手写的分配器来满足所需的对齐方式(例如 ::运算符 C++17 中的新运算符)。 这个分配器的性能很可能不如 Vulkan 默认的分配器,但如果它仅用于调试目的,它应该可以解决问题。

相关内容

最新更新