命令佇列和命令清單的設計原理

啟用重複使用轉譯工作和多執行緒調整的目標,需要 Direct3D 應用程式如何將轉譯工作提交至 GPU 的基本變更。 在 Direct3D 12 中,提交轉譯工作的程式與舊版不同,有三個重要方式:

  1. 刪除立即內容。 這會啟用多執行緒處理。
  2. 應用程式現在擁有轉譯呼叫如何分組為圖形處理單位, (GPU) 工作專案。 這可讓您重複使用。
  3. 應用程式現在會明確控制何時將工作提交至 GPU。 這會啟用專案 1 和 2。

移除立即內容

從 Microsoft Direct3D 11 到 Microsoft Direct3D 12 的最大變更是,不再有與裝置相關聯的單一立即內容。 相反地,若要轉譯,應用程式會建立可呼叫傳統轉譯 API 的命令清單。 命令清單看起來類似于 Direct3D 11 應用程式的轉譯方法,該應用程式使用立即內容,其中包含繪製基本類型或變更轉譯狀態的呼叫。 就像即時內容一樣,每個命令清單都不是自由執行緒;不過,可以同時記錄多個命令清單,以利用現代化、多核心處理器。

命令清單通常會執行一次。 不過,如果應用程式確保先前的執行完成,提交新的執行之前,可以多次執行命令清單。 如需命令清單同步處理的詳細資訊,請參閱 執行和同步處理命令清單

GPU 工作專案的群組

除了命令清單之外,Direct3D 12 還新增第二層稱為 套件組合的命令清單,利用目前所有硬體中存在的功能。 為了協助區別這兩種類型,第一層命令清單可以稱為 直接命令清單。 套件組合的目的是允許應用程式將少數 API 命令群組在一起,以供稍後在直接命令清單中重複執行。 在建立套件組合時,驅動程式會盡可能執行前置處理,以便讓後續的執行更有效率。 然後,您可以從多個命令清單內執行套件組合,並在相同的命令清單中多次執行。

重複使用套件組合是使用單一 CPU 執行緒提升效率的大型驅動程式。 因為套件組合已預先處理,而且可以多次提交,所以對套件組合內可執行哪些作業有特定限制。 如需詳細資訊,請參閱 建立和錄製命令清單和套件組合

GPU 工作提交

若要在 GPU 上執行工作,應用程式必須明確地將命令清單提交至與 Direct3D 裝置相關聯的命令佇列。 直接命令清單可以提交多次執行,但應用程式負責確保直接命令清單已在 GPU 上完成執行,然後再再次提交。 套件組合沒有並行使用限制,而且可以在多個命令清單中多次執行,但套件組合無法直接提交至命令佇列以供執行。

任何執行緒可以隨時將命令清單提交至任何命令佇列,執行時間會自動序列化命令佇列中的命令清單提交,同時保留提交順序。