共用方式為


執行和同步處理命令清單

在 Microsoft Direct3D 12 中,先前版本的立即模式已不存在。 相反地,應用程式會建立命令清單和套件組合,然後記錄 GPU 命令集。 命令佇列可用來提交要執行的命令清單。 此模型可讓開發人員更充分掌控圖形處理器 (GPU) 和 CPU 的有效使用方式。

命令佇列概觀

Direct3D 12 命令佇列會使用 API,以明確管理並行、平行處理原則和同步處理,取代先前未公開給開發人員的立即模式工作提交的執行時間和驅動程式同步處理。 命令佇列為開發人員提供下列改善:

  • 可讓開發人員避免意外同步處理所造成的意外效率。
  • 可讓開發人員在較高層級引進同步處理,以便更有效率且精確地判斷所需的同步處理。 這表示執行時間和圖形驅動程式會花費較少的時間以回應方式設計平行處理原則。
  • 讓昂貴的作業更加明確。

這些改進可啟用或增強下列案例:

  • 增加平行處理原則 - 當背景工作負載有個別佇列供前景工作使用時,應用程式可以使用更深入的佇列,例如視訊解碼。
  • 非同步和低優先順序 GPU 工作 - 命令佇列模型可同時執行低優先順序 GPU 工作和不可部分完成的作業,讓一個 GPU 執行緒取用另一個未同步處理執行緒的結果,而不會封鎖。
  • 高優先順序計算工作 - 此設計可讓需要中斷 3D 轉譯的案例執行少量高優先順序計算工作,以便提早取得結果,以便在 CPU 上進行其他處理。

初始化命令佇列

您可以呼叫 ID3D12Device::CreateCommandQueue來建立命令佇列。 這個方法會採用 D3D12_COMMAND_LIST_TYPE ,指出應該建立哪種類型的佇列,因此可以將何種類型的命令提交至該佇列。 請記住,套件組合只能從直接命令清單呼叫,且無法直接提交至佇列。 支援的佇列類型如下:

一般而言,DIRECT 佇列和命令清單會接受任何命令、計算佇列和命令清單接受計算和複製相關的命令,而 COPY 佇列和命令清單只接受複製命令。

執行命令清單

在您記錄命令清單並擷取預設命令佇列或建立新的命令佇列之後,您可以呼叫 ID3D12CommandQueue::ExecuteCommandLists來執行命令清單。

應用程式可以從多個執行緒將命令清單提交至任何命令佇列。 執行時間會依提交循序執行序列化這些要求的工作。

執行時間會驗證提交的命令清單,並在違反任何限制時卸載 ExecuteCommandLists 的呼叫。 系統會基於下列原因而捨棄呼叫:

從多個命令佇列存取資源

執行時間會強制執行幾個規則,以限制從多個命令佇列存取資源。 這些規則如下:

  1. 無法同時從多個命令佇列寫入資源。 當資源轉換至佇列上的可寫入狀態時,該佇列會被視為獨佔擁有,而且必須轉換至讀取或 COMMON 狀態, (參考 D3D12_RESOURCE_STATES) ,才能由另一個佇列存取。

  2. 當處於讀取狀態時,資源可以同時從多個命令佇列讀取,包括跨進程根據其讀取狀態。

如需資源存取限制和使用資源屏障同步處理資源存取的詳細資訊,請參閱 使用資源屏障來同步處理資源狀態

使用命令佇列柵欄同步處理命令清單執行

Direct3D 12 中多個平行命令佇列的支援可讓您更有彈性和控制 GPU 上非同步工作的優先順序。 此設計也表示應用程式需要明確管理工作的同步處理,特別是當某個佇列中的命令清單相依于另一個命令佇列所操作的資源時。 其中一些範例包括等候計算佇列上的作業完成,以便將結果用於 3D 佇列上的轉譯作業,以及等候 3D 作業完成,讓計算佇列上的作業可以存取要寫入的資源。 為了啟用佇列之間的工作同步處理,Direct3D 12 會使用由 ID3D12Fence 介面在 API 中表示的柵欄概念。

柵欄是整數,代表正在處理的工作單位。 當應用程式前進柵欄時,藉由呼叫 ID3D12CommandQueue::Signal,就會更新整數。 應用程式可以檢查柵欄的值,並判斷是否已完成工作單位,以決定是否可以啟動後續作業。

同步處理由命令佇列存取的資源

在 Direct3D 12 中,會使用資源屏障來實作某些資源的狀態。 在每個資源屏障上,應用程式會宣告資源的前後狀態。 常見的範例是讓資源在著色器資源檢視轉換為轉譯目標檢視之間轉換。 在大部分情況下,這些資源屏障是在命令清單中管理。 啟用偵錯層時,系統會強制所有資源的狀態前後相符,以確保資源在屏障轉換時處於正確狀態。

如需同步處理資源狀態的詳細資訊,請參閱 使用資源屏障同步處理資源狀態

磚資源的命令佇列支援

管理透過 Direct3D 11 中 ID3D11DeviceCoNtext2 介面公開之磚資源的方法,是由 Direct3D 12 中的 ID3D12CommandQueue 介面所提供。 這些方法包括:

方法 Description
CopyTileMappings 將對應從來源並排資源複製到目的地並排顯示的資源。
UpdateTileMappings 更新將磚資源中的磚位置對應至資源堆積中的記憶體位置。

如需在 Direct3D 12 應用程式中使用並排式資源的詳細資訊,請參閱 Direct3D11 並排顯示資源

Direct3D 12 中的工作提交