来自多个 .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"
命名空间 metal
和 coreimage
阻止计算内核在默认库中显示为可用函数。
找到这个 SO 答案,它建议构建单独的库:
您现在不能使用默认的 Metal 构建管道将包含 Core Image 内核的多个 .metal
文件编译到一个库中。当设置 -cikernel
标志时,链接器不允许将多个 .air
文件合并为一个 .metallib
。
您要么必须将所有内核放入一个 .metal
文件中,要么使用我在上面链接的答案中发布的解决方案。
您可以创建多个 Foo.metal
和 Bar.metal
文件。
只是不要将它们添加为链接器目标。
而不是 #include "Foo.metal"
和 #include "Bar.metal"
在 Main.metal
文件中。
并且只添加 Main.metal
文件作为链接器目标。
这样只有一个 .metal
文件,其中包括所有其他 .metal
文件。简单。
因此 Main.metal
文件的内容可能看起来很简单:
#include "Foo.metal"
#include "Bar.metal"
在将自定义 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"
命名空间 metal
和 coreimage
阻止计算内核在默认库中显示为可用函数。
找到这个 SO 答案,它建议构建单独的库:
您现在不能使用默认的 Metal 构建管道将包含 Core Image 内核的多个 .metal
文件编译到一个库中。当设置 -cikernel
标志时,链接器不允许将多个 .air
文件合并为一个 .metallib
。
您要么必须将所有内核放入一个 .metal
文件中,要么使用我在上面链接的答案中发布的解决方案。
您可以创建多个 Foo.metal
和 Bar.metal
文件。
只是不要将它们添加为链接器目标。
而不是 #include "Foo.metal"
和 #include "Bar.metal"
在 Main.metal
文件中。
并且只添加 Main.metal
文件作为链接器目标。
这样只有一个 .metal
文件,其中包括所有其他 .metal
文件。简单。
因此 Main.metal
文件的内容可能看起来很简单:
#include "Foo.metal"
#include "Bar.metal"