我試圖通過蘋果VDSP的DSPSplitComplex結構蘋果金屬在斯威夫特newBufferWithBytesNoCopy創建一個金屬緩衝對象:創建從VDSP DSPSplitComplex的金屬緩衝斯威夫特
// 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的結構。我如何從兩個UnsafeMutablePointers的結構中提取UnsafeMutablePointer?是不是& iData1獲取指向結構的指針?
我試着通過iData1.realp並指定要覆蓋realp和imagp的字節數。這消除了編譯錯誤,但我不確定realp和imagp是否以連續的方式駐留在內存中。
感謝您的幫助提前。
我的猜測是'newBufferWithBytesNoCopy'的第一個參數中的'UnsafeMutablePointer(&iData1)'。你可以在那裏傳遞'&iData1'嗎? –
rickster
2014-12-02 23:16:19
謝謝@rickster!它解決了這個問題。在這種情況下,iData1是否會自動轉換爲UnsafeMutablePointer?兩者之間有什麼區別(例如,UnsafeMutablePointer (&iData1)與just&iData1)?謝謝你的幫助! –
JustDoIt
2014-12-02 23:19:07
這在着色器中看起來像什麼?你能否顯示支持DSPSplitComplex的結構或其他聲明? – 2016-02-08 15:27:59