麻烦开始与金属着色器编译



我在开始使用Metal的着色器编译时遇到了麻烦。

如何使一个MTLLibrary,可以链接到一个MTLDynamicLibrary(或MTLLinkedFunctions),特别是一个库,声明extern函数是在运行时解决时提供preloadedLibraries(或linkedFunctions)在计算管道描述符?例如,我可以使用xcrun metal(带选项-c)将以下代码编译为air,但随后调用xcrun metallib(即使带选项--split-module-without-linking)会给出错误LLVM ERROR: Undefined symbol: _Z3addjj。换句话说,我如何制作一个"部分绑定"的金属库?

// shader.h
extern uint add(uint a, uint b);
/// shader.metal
#include "shader.h"
kernel void kernel_func(uint gid [[ thread_position_in_grid ]]) { add(gid,2); }

WWDC2021提到了这个extern技术,但是前一年的动态库代码样本没有使用extern(或installName),所以我不明白它的意义。

当创建使用动态库的可执行库时,有两点必须包含动态库(我认为只有一个)。根据可执行源代码是在构建时编译还是在运行时编译,该过程会有所不同。我将描述运行时的情况,因为我还没有弄清楚从metallib文件创建的可执行库的情况。

  1. 第一点是在编译可执行文件时,必须在CompileOptionslibraries字段中包含动态库。这个库在这里只是一个虚拟的,用来检查你是否有一个动态库,它定义了允许适当链接的声明,尽管在这个阶段没有发生链接,只是检查。
  2. 第二点是当您创建管道状态时,您必须在管道描述符的preloadedLibraries字段中包含动态库。这一次,动态库不是一个虚拟的库,而是您计划使用的真正库,因为它将在管道创建期间与可执行文件链接。

最新更新