MTLDevice.makeBuffer上的金属碎片(bytes:length:options :)

时间:2018-07-13 17:33:15

标签: swift metal

我在《金属编程指南》 一书中使用了一个用于iOS的简单Metal程序,但是makeBuffer(bytes:length:options:)并不按书中所述工作。

下面的相关代码

let vertexData: [Float] = [
    0.0,  0.5,  0.0,
    -1.0, -0.5,  0.0,
    1.0,  -0.5,  0.0
    ]

let dataSize = vertexData.count * MemoryLayout.size(ofValue: vertexData[0])
vertexBuffer = device.makeBuffer(bytes: vertexData, length: dataSize,
    options: [.storageModePrivate]) // error on this line

...

let renderEncoder = commandBuffer?.makeRenderCommandEncoder(
    descriptor: renderPassDescriptor)
renderEncoder?.setVertexBuffer(vertexBuffer, offset: 0, index: 0)
// skipping other setups
renderEncoder?.endEncoding()

将在运行时导致崩溃,这是错误日志:

  

-[MTLDebugDevice newBufferWithBytes:length:options:]:494: failed assertion `storageModePrivate incompatible with ...WithBytes variant of newBuffer'

但是,如果我在[]中使用options作为makeBuffer(bytes:length:options:)的参数,则该程序可以正常工作:

vertexBuffer = device.makeBuffer(bytes: vertexData, length: dataSize,
    options: []) // this will run

但是为什么会这样呢?

1 个答案:

答案 0 :(得分:0)

我也正在阅读《金属编程指南》 这本书,并且遇到了同样的问题。

我通过将存储模式更改为id来解决它。

我将失败的行更改为:

const postId = this.$route.query.id

此后,我就可以将三角形渲染到手机上。