2016-10-03 150 views
1

假設金屬頂點着色器A更新緩衝區buf。另外假設我有第二個頂點着色器B,它在A之後編碼。 B可以使用buf中的結果嗎?B可能會在A結束之前開始執行,這意味着緩衝區的內容尚未準備好?金屬在下一個頂點着色器執行之前是否完成一個頂點着色器?

+0

寫入一個渲染命令編碼器在隨後的命令編碼器中可見。在平局級別沒有這樣的保證。 – warrenm

+0

頂點着色器輸出點。您也可以將它們用作生成將由片段着色器進行插值的數據的機會。你沒有用它們寫入緩衝區。你在着色器中寫什麼緩衝區?頂點着色器如何更新緩衝區?你是否想要問一個計算着色器而不是頂點着色器? –

+0

您可以從頂點着色器寫入設備緩衝區,就像在計算着色器中一樣。看起來我可以通過更新頂點着色器中的某些緩衝區而不是寫入專用計算着色器來節省一些開銷。只是不確定在完成先前繪圖命令之前GPU是否開始處理下一個繪圖命令,從而使得從頂點着色器更新的設備緩衝器的內容不可預測。 Apple文檔似乎沒有解決這個問題,因爲它不符合頂點着色器的典型用法。 – gloo

回答

0

第二個頂點着色器B可以在頂點着色器A之前自由執行,如果它們編碼在相同的MTLRenderCommandEncoder。如果您想要讀取B中的A的輸出,那麼它們必須由單獨的MTLRenderCommandEncoder編碼。

但是,請注意,相同的是而不是MTLComputeCommandEncoder內的計算調度的真實性。所述relevant part of the doc狀態:

執行計算命令

爲了編碼命令來執行一個計算 功能,調用dispatchThreadgroups:threadsPerThreadgroup:方法MTLComputeCommandEncoder的 並指定線程組的尺寸和 線程組的數目。您可以查詢MTLComputePipelineState的threadExecutionWidth和 maxTotalThreadsPerThreadgroup屬性爲 優化此設備上計算功能的執行。

對於compute函數的最高效的執行,設置由threadsPerThreadgroup參數傳遞給 dispatchThreadgroups指定的線程的總數 :threadsPerThreadgroup:方法來 threadExecutionWidth的倍數。線程組中的線程總數爲 threadsPerThreadgroup組件的乘積: threadsPerThreadgroup.width * threadsPerThreadgroup.height * threadsPerThreadgroup.depth。 maxTotalThreadsPerThreadgroup 屬性指定在單個線程組中可以在該設備上執行此計算功能的最大線程數。

計算命令按其編碼爲 的順序執行到命令緩衝區中。當與命令完成執行相關聯的所有 線程組以及所有 結果寫入內存時,compute命令將結束執行。由於這種排序,計算命令的結果 可用於在命令緩衝區中編碼後的任何命令。

要結束計算命令編碼器的編碼命令,請調用MTLComputeCommandEncoder的endEncoding方法。 結束前一個命令編碼器後,可以創建任何類型的新命令編碼器 以將其他命令編碼到命令緩衝區中。