【发布时间】:2014-12-02 23:01:58
【问题描述】:
我正在尝试在 Swift 中将 Apple vDSP 的 DSPSplitComplex 结构传递给 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 是否以连续的方式驻留在内存中。
提前感谢您的帮助。
【问题讨论】:
-
我的猜测是
newBufferWithBytesNoCopy的第一个参数中的UnsafeMutablePointer<Void>(&iData1)。你可以在那里传递&iData1吗? -
谢谢@rickster!它解决了这个问题。在这种情况下 &iData1 会自动转换为 UnsafeMutablePointer
吗?两者之间有什么区别(例如,UnsafeMutablePointer (&iData1) 与仅 &iData1)?感谢您的帮助! -
这在着色器中是什么样子的?您能否展示支持 DSPSplitComplex 的结构或其他声明?
标签: objective-c swift struct vdsp metal