Swift 如何使用MTLBlitCommandEncoder将隔行扫描的视频场复制到MTLBuffer中
我们正在使用隔行高清视频。我用于渲染的金属颜色附件的尺寸为一个字段(1920*540 RGBA)。 当我尝试将两个渲染字段复制到大小为1920*1080*4=8294400字节的同一MTLBuffer中时,仅当目标偏移量为零时才有效Swift 如何使用MTLBlitCommandEncoder将隔行扫描的视频场复制到MTLBuffer中,swift,macos,metal,Swift,Macos,Metal,我们正在使用隔行高清视频。我用于渲染的金属颜色附件的尺寸为一个字段(1920*540 RGBA)。 当我尝试将两个渲染字段复制到大小为1920*1080*4=8294400字节的同一MTLBuffer中时,仅当目标偏移量为零时才有效 let commandBuffer = commandQueue.makeCommandBuffer() let blitEncoder = commandBuffer.makeBlitCommandEncoder() blitEncoder.copy(from:
let commandBuffer = commandQueue.makeCommandBuffer()
let blitEncoder = commandBuffer.makeBlitCommandEncoder()
blitEncoder.copy(from: attachmentTexture,
sourceSlice: 0,
sourceLevel: 0,
sourceOrigin: MTLOriginMake(0, 0, 0),
sourceSize: MTLSizeMake(attachmentTexture.width, attachmentTexture.height, 1),
to: destinationBuffer,
destinationOffset: 1920*4,
destinationBytesPerRow: 1920*4*2,
destinationBytesPerImage: destinationBuffer.length)
blitEncoder.endEncoding()
commandBuffer.commit()
对于目标偏移量为零的第一个字段,该函数运行良好。每第二行就填充一次目标缓冲区
但是,当我想将第二个字段用相同的代码写入同一个MTLBuffer对象时,只需将destinationOffset设置为1920*4,就像您在上面的代码中看到的那样(从缓冲区中的第二行开始),我就会得到如下断言:
-[MTLDEBUGBLITCOMMANDENDECODER validateCopyFromTexture:sourceSlice:sourceLevel:sourceOrigin:sourceSize:toBuffer:destinationOffset:destinationBytesPerRow:destinationBytesPerImage:options::677:
失败的断言'totalBytesUsed(8302080)一定是我最近也遇到了类似的情况 您正在将
destinationBuffer.length
传递给destinationBytesPerImage:
参数。正如您所注意到的,Metal将偏移量和每个图像的字节数相加,并将其与到:
目标缓冲区(destinationBuffer
)的长度进行比较。需要注意的是,每个图像的偏移量加上字节数将无法放入缓冲区,因此拒绝接受
您可能只需将0传递给destinationBytesPerImage:
,因为您没有使用3D或2D阵列纹理。如果不起作用,请传递destinationBuffer.length-1920*4