Metal makeComputeCommandEncoder assertion failure



我正在尝试设置和执行一个计算内核并将其输出提交给MTKView进行绘制。但是我得到以下崩溃:

-[MTLDebugCommandBuffer computeCommandEncoder]:889: failed assertion `encoding in progress'

下面的代码有什么问题?是否不支持使用相同的命令缓冲区将计算着色器的输出馈送到渲染管道?

func computeKernel(_ texture:MTLTexture, commandBuffer:MTLCommandBuffer) {
let computeEncoder = commandBuffer.makeComputeCommandEncoder()
computeEncoder?.setComputePipelineState(computePipelineState!)
computeEncoder?.setTexture(texture, index: 0)
computeEncoder?.setTexture(texture, index: 1)
computeEncoder?.dispatchThreadgroups(threadgroupCount, threadsPerThreadgroup: threadgroupSize)
computeEncoder?.endEncoding()
/*
commandBuffer.commit()
commandBuffer.waitUntilCompleted()
*/
}

override func draw(_ rect: CGRect) {

guard let drawable = currentDrawable,
let currentRenderPassDescriptor = currentRenderPassDescriptor
else {
return
}

// Set up command buffer and encoder
guard let commandQueue = commandQueue else {
print("Failed to create Metal command queue")
return
}
guard let commandBuffer = commandQueue.makeCommandBuffer() else {
print("Failed to create Metal command buffer")
return
}
guard let commandEncoder = commandBuffer.makeRenderCommandEncoder(descriptor: currentRenderPassDescriptor) else {
print("Failed to create Metal command encoder")
return
}

commandEncoder.label = "Preview display"
let texture = ... //Grab a Metal texture
computeKernel(texture, commandBuffer: commandBuffer)
commandEncoder.setRenderPipelineState(defaultRenderPipelineState!)

commandEncoder.setFragmentTexture(texture, index: 0)
commandEncoder.setVertexBytes(vertices, length: vertices.count * MemoryLayout<AAPLVertex>.stride, index: 0)
commandEncoder.drawPrimitives(type: .triangleStrip, vertexStart: 0, vertexCount: 4)
commandEncoder.endEncoding()
commandBuffer.present(drawable) // Draw to the screen
commandBuffer.commit()
}

可以将计算和呈现工作编码到同一命令缓冲区中,但在现有命令编码器编码时无法启动另一个命令编码器。在本例中,创建呈现命令编码器,然后调用一个函数,该函数创建计算命令编码器而不结束呈现命令编码器。相反,您应该调用计算函数,然后创建并使用呈现命令编码器。

最新更新