Проблема доступа к MTLBuffer через набранный UnsafeMutualPointer - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть функция, которой передается необязательный MTLBuffer. Моя цель - итеративно изменять значения в этом буфере, используя индекс в типизированный указатель на тот же буфер. Однако когда я запускаю код, я получаю сообщение об ошибке «Поток 1: EXC_BAD_ACCESS (code = 2, address = 0x1044f1000)».

Правильно ли я преобразовываю в типизированный UnsafeMutablePointer?

Было бы лучше перевести в типизированный UnsafeMutableBufferPointer? Если это так, как мне преобразовать MTLBuffer в типизированный 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)
}

Спасибо!

1 Ответ

2 голосов
/ 22 февраля 2020

Правильно ли я конвертирую в типизированный UnsafeMutablePointer?

NO.

Когда вы звоните 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)
}
...