2017-03-28 43 views
1

我們正在處理隔行高清視頻。我用於渲染的金屬顏色附件具有一個字段(1920 * 540 RGBA)的尺寸。 當我嘗試將兩個渲染字段複製到具有1920 * 1080 * 4 = 8294400字節大小的相同MTLBuffer時,它僅適用於目標偏移量爲零的情況。如何使用MTLBlitCommandEncoder將隔行視頻字段複製到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,就像您在上面的代碼中看到的(從緩衝區中的第二行開始),那麼我得到一個說法是這樣的:

- [MTLDebugBlitCommandEncoder validateCopyFromTexture:sourceSlice:sourceLevel:sourceOrigin:sourceSize:toBuffer:destinationOffset:destinationBytesPerRow:destinationBytesPerImage:選項:]:677: 失敗的斷言`totalBytesUsed(8302080)必須< = destinationBuffer length。'

totalBytesUsed正好是以字節爲單位的目標緩衝區長度加上偏移量。所以我在這個函數中使用的每個偏移量都會導致這個斷言錯誤。

有人能解釋我如何因爲周圍的其他方法一樣傳入視頻幀創建兩個MTLTexture對象(奇數和偶數場)有類似的參數效果很好正確使用此功能。

回答

1

我最近也遇到過這樣的事情。

你傳遞destinationBuffer.lengthdestinationBytesPerImage:參數。正如您已經注意到的那樣,Metal將偏移量和每像素字節數加在一起,並將其與目標緩衝區(destinationBuffer)的長度進行比較。它注意到偏移量和每個圖像的字節數不適合緩衝區並拒絕接受。

您可以簡單地通過0 destinationBytesPerImage:,因爲你不能用3D或2D陣列質感工作。如果這不起作用,請通過destinationBuffer.length - 1920*4

相關問題