通过类型化的 UnsafeMutualPointer 访问 MTLBuffer 时出现问题

Problem accessing MTLBuffer via typed UnsafeMutualPointer

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

我是否正确转换为 Typed UnsafeMutablePointer?

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

知道我为什么会收到此错误吗?

注意:为了简单起见,我删除了大部分保护检查。我已经确认 MTLDevice(通过设备)、bufferA 分配、dataPtr 和 floatPtr 都是非零的。 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)
}

谢谢!

我是否正确转换为 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)
}