Metalkit:MTLBuffer和swift 3中的指针
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Metalkit:MTLBuffer和swift 3中的指针相关的知识,希望对你有一定的参考价值。
我从Metalkit开始,我有一个非常简单的内核作为测试用例。
kernel void compute(device float* outData [[ buffer(0) ]])
{
outData[0] = 234.5;
outData[3] = 345.6;
}
这个“计算”数据存储在MTLBuffer
中。
var buffer : MTLBuffer?
...
buffer = device.makeBuffer(length: MemoryLayout<Float>.size * 5, options: [])
...
commandBuffer.waitUntilCompleted()
此时内核已经将一些测试数据写入MTLBuffer
。问题是我应该如何从主程序访问该数据?
我从unsafeMutableRawPointer
得到一个buffer.contents()
。如何获得可以在其他地方使用的快速数组值(在屏幕上显示,写入文件,......)?
这些片段在这个非常简单的应用程序中工作,但我不确定它们是否正确:
let raw = buffer.contents()
let b = raw.bindMemory(to: Float.self, capacity: 5)
print(b.advanced(by: 3).pointee)
let a = raw.assumingMemoryBound(to: Float.self)
print(a.advanced(by: 3).pointee)
let bufferPointer = UnsafeBufferPointer(start: b, count: 5)
let values = Array(bufferPointer)
print(values)
let value = raw.load(fromByteOffset: MemoryLayout<Float>.size * 3, as: Float.self)
print(value)
bindMemory
和assumingMemoryBound
都工作。虽然assumingMemoryBound
假设底层字节已经打字,bindMemory
没有。我认为其中一个应该有效,但不是两个都有效。应该是哪一个,为什么?
答案
我使用下面提供的代码加载到数组,但我不能决定我或你的版本是否最好。
let count = 16
var array = [Float]()
array.reserveCapacity(count)
for i in 0..<count {
array.append(buffer.contents().load(fromByteOffset: MemoryLayout<Float>.size * i, as: Float.self))
}
以上是关于Metalkit:MTLBuffer和swift 3中的指针的主要内容,如果未能解决你的问题,请参考以下文章
MetalKit - Drawable.texture 断言错误
何时可以安全地重写和重用 MTLBuffer 或其他 Metal 顶点缓冲区?
在 Metal 中,将顶点和片段缓冲区设置为相同的 MTLBuffer 是不是仅将其复制到 GPU 一次?