objective-c - 在 Swift 中从 vDSP DSPSplitComplex 创建 Metal 缓冲区

标签 objective-c swift struct vdsp metal

我试图在 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 是否以连续的方式驻留在内存中。

感谢您提前提供的帮助。

最佳答案

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

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

参见Pointers 使用 Swift 与 Cocoa 和 Objective-C 了解更多详细信息和其他有效语法。

关于objective-c - 在 Swift 中从 vDSP DSPSplitComplex 创建 Metal 缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27260682/

相关文章:

objective-c - 按下 enter 时 UISearchBar 不会关闭键盘

swift - 更改prepareforsegue中的标签

Swift 5 – 如何在可能将肤色表情符号作为输入的案例语句中使用基本表情符号?

iphone - 有没有办法将文本转换为代码?

ios - 解析iOS SDK:如何在创建PFObject时复制objectId

objective-c - 在 View 上显示图像 1 秒

ios - UISearchBar 增加了 iOS 11 中的导航栏高度

go - 从接口(interface)中获取所有字段

C中链表的冗余计数

ios - UITableView 在每个单元格中显示数组中的最后一项