MetalCompilerPlugin

Swift Package Manager 插件,用于编译可在 Xcode Metal Debugger 中调试的 Metal 文件。

描述

Swift Package Manager 现在1 似乎将目标中的所有 Metal 文件编译成一个 default.metallib。遗憾的是,此文件无法在 Xcode Metal Debugger 中调试。

无法创建着色器调试会话

源文件不可用

在目标的“Build Settings”下,确保 Metal Compiler Build Options 生成调试信息并包含源代码。

如果使用 'metal' 命令行工具构建,请包含选项 '-gline-tables-only' 和 '-frecord-sources'。

(屏幕截图)。

此插件提供了一种替代方法,将 Metal 文件编译成可以调试的 metallib

此项目还展示了如何创建一个 Pure-Metal target”(纯 Metal 目标),该目标可用于包含您的 Metal 源代码和头文件。

用法

在您的 Package.swift 文件中,添加 MetalCompilerPlugin 作为依赖项。并将 MetalCompilerPlugin 添加到您目标的 plugins 数组中。

例如

    dependencies: [
        .package(url: "https://github.com/schwa/MetalCompilerPlugin", branch: "main"),
    ],
    targets: [
        .target(name: "MyExampleShaders", plugins: [
            .plugin(name: "MetalCompilerPlugin", package: "MetalCompilerPlugin")
        ]),
    ]

请注意,输出 metal 库文件的标题将为 debug.metallib,并将与 default.metallib 文件并排存在。请参阅下面的局限性

局限性

输出 metal 库文件将为 debug.metallib,并将与 default.metallib 文件并排存在。这是因为 default.metallib 文件由 Swift Package Manager 创建,无法被覆盖。

您将无法使用 MTLDevice.makeDefaultLibrary() 加载 debug.metallib 文件。相反,您需要使用 MTLDevice.makeLibrary(url:) 加载 debug.metallib 文件。有关示例,请参见单元测试。

Pure-Metal Targets(纯 Metal 目标)

“Pure-Metal”目标是仅包含 Metal 源代码和头文件的目标。这对于包含大量 Metal 代码并希望将其与项目其余部分分开的项目非常有用。

这也很有用,以便 Metal 和 Swift 可以共享在公共头文件中定义的类型。例如,头文件中定义的 Vertex 或 Uniforms 结构可以被 Metal 和 Swift 代码使用。

直接共享 Metal 类型与 Swift 可以防止类型重复,并确保您的类型在 Metal 和 Swift 之间具有一致的布局和填充。简单地在 Metal 和 Swift 中手动定义相同的类型是不够的,并且可能导致细微的内存对齐相关的崩溃或数据损坏。

请参阅 Package.swift 文件中的 ExampleShaders 目标。“Pure-Metal”目标不得包含任何 Swift 文件。它应包含您的 Metal 源代码和头文件(包含在包含的文件夹中)。它还应包含一个 Module.map 文件,该文件允许 Swift 导入头文件。

许可证

BSD 3-clause。请参阅 LICENSE.md

TODO

脚注

  1. 在 Swift Package Manager 5.3 之前,完全无法处理 Metal 文件。5.3 版本增加了处理资源(包括 Metal 文件)的功能。在 5.3 和 5.7 版本之间的某个时候,Swift Package Manager 获得了透明编译包中所有 Metal 文件的能力。