【问题标题】:Creating a Metal buffer from vDSP DSPSplitComplex in Swift在 Swift 中从 vDSP DSPSplitComplex 创建一个 Metal 缓冲区
【发布时间】: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&lt;Void&gt;(&amp;iData1)。你可以在那里传递&amp;iData1吗?
  • 谢谢@rickster!它解决了这个问题。在这种情况下 &iData1 会自动转换为 UnsafeMutablePointer 吗?两者之间有什么区别(例如,UnsafeMutablePointer(&iData1) 与仅 &iData1)?感谢您的帮助!
  • 这在着色器中是什么样子的?您能否展示支持 DSPSplitComplex 的结构或其他声明?

标签: objective-c swift struct vdsp metal


【解决方案1】:

只需将&amp;iData1 作为第一个参数传递给newBufferWithBytesNoCopy

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

请参阅将 Swift 与 Cocoa 和 Objective-C 结合使用中的Pointers,了解更多详细信息和其他有效语法。

【讨论】:

    猜你喜欢
    • 2020-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    相关资源
    最近更新 更多