2016-03-14 79 views
1

我正在使用頂點和像素着色器來執行基本操作,如頂點着色器中的矩陣乘法和使用像素着色器的紋理採樣。我在下面的語句中想知道最後一條語句是否等待直到頂點和像素着色器操作被執行。ID3D11DeviceContext :: DrawIndexed方法是否等待頂點和像素着色器操作完成?

deviceContext->VSSetShader(VS, NULL, 0); 
deviceContext->PSSetShader(PS, NULL, 0); 
deviceContext->PSSetSamplers(0, 1, &Sampler); 
deviceContext->DrawIndexed(IndexCount, 0, 0); // Does it wait for pixel operations to be performed on all pixels? 
+0

你的問題既有趣又太寬泛。你有證據表明這種情況是並行發生的,而不是按順序發生的?哪些視頻芯片和驅動程序?這對你的項目有什麼影響? –

+0

我在我的項目中沒有任何問題,但是試圖確保在DrawIndexed()調用返回後,所有像素操作都在GPU中執行的着色器中執行。換句話說,GPU是否有與CPU主機交互的方式來完成它。 (在文檔中找不到關於此的任何信息)。試圖斷言在這個調用返回並且場景使用IDXGISwapChain :: Present方法呈現之後,每個像素的所有像素操作總是完成。 –

回答

2

在D3D,工作在其提交的順序GPU上執行,但通常不與CPU同步。例如,在您的代碼中,在CPU返回DrawIndexed時,GPU很可能還沒有開始渲染。通常數以萬計的命令一次「在飛行中」。在D3D11中,你通常不需要關心這種行爲,事實上,在API中引入競爭條件是非常困難的。例如,當您致電Present時,GPU將自動刷新所有渲染,等待影響交換鏈的所有調用完成,並將正確的圖像呈現給窗口。

總之 - 不,D3D在從Draw調用返回之前不會等待頂點/像素着色器操作完成,但通常您可以忽略此事實。

+0

當然,在Direct3D 12中,同步是明確的,因此應用程序編碼人員必須插入柵欄並檢查其狀態,以確保銷燬參考資源的安全性。 –

+0

感謝您的詳細解釋,它有幫助。 –