2017-02-16 63 views
0

同步均勻緩衝器更新假設我有以下代碼(簡化):在金屬

id<MTLBuffer> uniforms = ...; 
MTLRenderCommandEncoder encoder = ...; 

[uniforms contents] = some_data; 
[encoder setVertexbuffer: uniforms ...]; 

DrawSomethingWithShader("myshader"); 

[uniforms contents] = some_other_data; // WRONG! overwrites previous draw call's uniforms 
[encoder setVertexbuffer: uniforms ...]; 

DrawSomethingElseWithShader("myshader"); 

在福爾康有一個機制,這個叫vkCmdPipelineBarrier()。然而,我找不到任何類似的金屬(MTLFence是一個候選人,但似乎它用於其他類型的東西)。

所以我的問題是如何同步這個緩衝區更新?

(PS .:我目前的想法是跟蹤緩衝區修改和「第二統一的數據」複製到其他位置,但它是相當複雜的一個強大的方式來實現)

回答

1

你需要確保編碼到命令緩衝區的每個繪圖調用的統一數據不僅可以直到您結束編碼,而且直到命令緩衝區本身完成爲止。

這意味着您應該向緩衝區的內容指針添加一個偏移量,並在緩衝區的連續部分中爲連續繪製調用寫入統一數據。然後,您應該不寫入對應於此幀的緩衝區,直到它完成。

由於您可能會在您正在編碼的幀完成前繪製下一幀的回調函數,因此應該使用緩衝池並在它們之間循環,以計數信號量控制訪問。該建議詳見Metal Best Practices Guide

+0

這就是我害怕...無論如何。 (ps .:我把問題再打開幾天) – Asylum