2

我正在尝试将 Apple vDSP 的 DSPSplitComplex 结构传递给 Swift 中的 Apple Metal 的 newBufferWithBytesNoCopy 以创建一个 Metal 缓冲区对象:

    // Create vDSP Split Complex data type
    var iData1Real = [Float](count: Int(lenIData1), repeatedValue: 1.0)
    var iData1Imag = [Float](count: Int(lenIData1), repeatedValue: 2.0)

    withExtendedLifetime(iData1Real) { () -> () in
        withExtendedLifetime(iData1Imag) {
            var iData1 = DSPSplitComplex(realp: &iData1Real, imagp: &iData1Imag)

            // Create a 1D buffer for the first input data (idata1)
            var bufferIData1: MTLBuffer = device.newBufferWithBytesNoCopy(UnsafeMutablePointer<Void>(&iData1), length:Int(lenIData1)*sizeof(Float32), options:nil, deallocator:nil)
        }
      }

这会导致错误

Type 'MTLBuffer!' does not conform to protocol 'MTLBuffer'

在用于创建 bufferIData1 的行中。

DSPSplitComplex 是两个 UnsafeMutablePointer 的结构。如何从两个 UnsafeMutablePointer 的结构中提取 UnsafeMutablePointer?&iData1 不是得到指向结构的指针吗?

我尝试传递 iData1.realp 并指定覆盖 realp 和 imagp 的字节数。这消除了编译错误,但我不确定 realp 和 imagp 是否以连续的方式驻留在内存中。

我在这里先向您的帮助表示感谢。

4

1 回答 1

2

只需将&iData1第一个参数传递给newBufferWithBytesNoCopy.

在与采用指针的 C API 交互时,prefix&已经(有效地)为您提供了指向前缀值的指针。使用UnsafeMutablePointer初始化程序并将&-prefixed 值传递给它本质上会得到一个双指针,这可能不是您调用的 API 想要的。

有关更多详细信息和其他有效语法,请参阅Using Swift with Cocoa and Objective-C中的指针。

于 2014-12-03T00:35:22.180 回答