【问题标题】:Problem accessing MTLBuffer via typed UnsafeMutualPointer通过类型化的 UnsafeMutualPointer 访问 MTLBuffer 时出现问题
【发布时间】:2020-06-06 20:58:41
【问题描述】:

我有一个传递可选 MTLBuffer 的函数。我的目标是使用索引迭代地更改该缓冲区中的值到指向同一缓冲区的类型化指针。但是,当我运行代码时,出现错误“线程 1:EXC_BAD_ACCESS (code=2, address=0x1044f1000)”。

我是否正确转换为 Typed UnsafeMutablePointer?

转换为类型化的 UnsafeMutableBufferPointer 会更好吗?如果是这样,我将如何从 MTLBuffer 转换为 Typed UnsafeMutableBufferPointer?

知道为什么会出现此错误吗?

注意:为了简单起见,我删除了大多数警戒检查。我已经确认 MTLDevice(通过设备)、bufferA 分配、dataPtr 和 floatPtr 都不是 nil。 floatPtr 和 dataPtr 确实指向同一个内存地址。

这是我分配缓冲区的方式:

bufferSize = 16384
bufferA = device?.makeBuffer(length: bufferSize, options: MTLResourceOptions.storageModeShared)`

这是我在缓冲区上运行的代码:

guard let dataPtr = bufferA?.contents() else {
  fatalError("error retrieving buffer?.contents() in generateRandomFloatData()")
}

let floatPtr = dataPtr.bindMemory(to: Float.self, capacity: bufferA!.length)

for index in 0...bufferSize - 1 {
  floatPtr[index] = 1.0 // Float.random(in: 0...Float.greatestFiniteMagnitude)
}

谢谢!

【问题讨论】:

    标签: swift metal swift5


    【解决方案1】:

    我是否正确转换为 Typed UnsafeMutablePointer?

    没有。

    当您调用 makeBuffer(length:options:) 时,您会传递 length 以字节为单位。 但是,Float 在内存中占用 4 个字节。

    所以,你可能需要修改一些与元素数量相关的部分:

    let floatPtr = dataPtr.bindMemory(to: Float.self, capacity: bufferA!.length/MemoryLayout<Float>.stride)
    
    for index in 0..<bufferSize/MemoryLayout<Float>.stride {
      floatPtr[index] = 1.0 // Float.random(in: 0...Float.greatestFiniteMagnitude)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 2019-12-20
      • 2019-12-06
      相关资源
      最近更新 更多