Swift 如何使用MTLBlitCommandEncoder将隔行扫描的视频场复制到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:

我们正在使用隔行高清视频。我用于渲染的金属颜色附件的尺寸为一个字段(1920*540 RGBA)。 当我尝试将两个渲染字段复制到大小为1920*1080*4=8294400字节的同一MTLBuffer中时,仅当目标偏移量为零时才有效

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