来自多个 .metal 文件(计算内核和 CIKernel 实现)的一个默认 MTLLibrary?

One default MTLLibrary from multiple .metal files (compute kernel and CIKernel implementations)?

在将自定义 Core Image 滤镜内核迁移到 Metal Shading Language 时,我在构建默认 Metal 库时遇到错误 (default.metallib):

metallib: error: exactly one input file required

我的印象是这些可能在单独的 .metal 文件中。试图将它们合并到一个文件中会导致此错误:

Metal library creation failed: Error Domain=MTLLibraryErrorDomain Code=3 "Filters module must contain no vertex/fragment/kernel functions but contains 1 kernel function"

命名空间 metalcoreimage 阻止计算内核在默认库中显示为可用函数。

找到这个 SO 答案,它建议构建单独的库:

您现在不能使用默认的 Metal 构建管道将包含 Core Image 内核的多个 .metal 文件编译到一个库中。当设置 -cikernel 标志时,链接器不允许将多个 .air 文件合并为一个 .metallib

您要么必须将所有内核放入一个 .metal 文件中,要么使用我在上面链接的答案中发布的解决方案。

您可以创建多个 Foo.metalBar.metal 文件。 只是不要将它们添加为链接器目标。

而不是 #include "Foo.metal"#include "Bar.metal"Main.metal 文件中。 并且只添加 Main.metal 文件作为链接器目标。

这样只有一个 .metal 文件,其中包括所有其他 .metal 文件。简单。


因此 Main.metal 文件的内容可能看起来很简单:

#include "Foo.metal"
#include "Bar.metal"