2014-12-02 63 views
2

我試圖通過蘋果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是否以連續的方式駐留在內存中。

感謝您的幫助提前。

+1

我的猜測是'newBufferWithBytesNoCopy'的第一個參數中的'UnsafeMutablePointer (&iData1)'。你可以在那裏傳遞'&iData1'嗎? – rickster 2014-12-02 23:16:19

+0

謝謝@rickster!它解決了這個問題。在這種情況下,iData1是否會自動轉換爲UnsafeMutablePointer ?兩者之間有什麼區別(例如,UnsafeMutablePointer (&iData1)與just&iData1)?謝謝你的幫助! – JustDoIt 2014-12-02 23:19:07

+0

這在着色器中看起來像什麼?你能否顯示支持DSPSplitComplex的結構或其他聲明? – 2016-02-08 15:27:59

回答

2

剛剛通過&iData1爲第一個參數newBufferWithBytesNoCopy

當與採用指針的C API進行交互時,前綴&已經(有效)使您獲得指向前綴值的指針。使用UnsafeMutablePointer初始值設定項並將一個&前綴值傳遞給本質上會得到一個雙指針,這可能不是您要調用的API所需的值。

請參閱Pointers in 使用Swift with Cocoa和Objective-C以獲取更多詳細信息和其他有效語法。