无法在使用Swift的Metal中加载默认库

3

对于我的项目(正在编译为框架),我有一个名为 ops.metal 的文件:

kernel void add(device float *lhs [[buffer(0)]],
                device float *rhs [[buffer(1)]],
                device float *result [[buffer(2)]],
                uint id [[ thread_position_in_grid ]])
{
    result[id] = lhs[id] + rhs[id];
}

以下是 Swift 代码:

@available(OSX 10.11, *)
public class MTLContext {
    var device: MTLDevice!
    var commandQueue:MTLCommandQueue!
    var library:MTLLibrary!
    var commandBuffer:MTLCommandBuffer
    var commandEncoder:MTLComputeCommandEncoder

    init() {
        if let defaultDevice = MTLCreateSystemDefaultDevice() {
            device = defaultDevice
            print("device created")
        } else {
            print("Metal is not supported")
        }

        commandQueue = device.makeCommandQueue()

        library = device.newDefaultLibrary()
        if let defaultLibrary = device.newDefaultLibrary() {
            library = defaultLibrary
        } else {
            print("could not load default library")
        }

        commandBuffer = commandQueue.makeCommandBuffer()
        commandEncoder = commandBuffer.makeComputeCommandEncoder()
    }

    deinit {
        commandEncoder.endEncoding()
    }
}

当我在单元测试中尝试创建MTLContext实例时,设备已经被创建,但是默认库无法创建("could not load default library")。我已经检查编译后的框架在Resources中是否有default.metallib文件(这是使用newDefaultLibrary最常见的原因)。
不幸的是,我还没有找到任何能够在Metal着色器文件中创建计算kernel的工作示例(虽然有一些使用性能着色器的示例,但它们不需要在着色器文件中制作内核)。
如果您有任何建议,将不胜感激!
1个回答

8

newDefaultLibrary()函数从当前运行应用程序的捆绑包中加载。它不会在任何嵌入式框架或其他位置搜索库。

如果您想使用编译到嵌入式框架中的metallib,最简单的方法是获取其所在Bundle的引用,然后请求该bundle的默认库:

let frameworkBundle = Bundle(for: SomeClassFromMyShaderFramework.self)
guard let defaultLibrary = try? device.makeDefaultLibrary(bundle: frameworkBundle) else {
    fatalError("Could not load default library from specified bundle")
}

这需要在框架中至少有一个公开可见的类来包含您的着色器,但这可以非常简单,仅声明一个空类专门用于执行捆绑查找:

public class SomeClassFromMyShaderFramework {}

太棒了,谢谢!如果文档提到这个细节就好了...不过,我猜大多数人都不会围绕Metal创建框架。 - Abe Schneider

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接