執行和同步命令清單
在 Microsoft Direct3D 12 中,舊版的立即模式已不存在。 相反地,應用程式會建立命令清單和配套,然後記錄 GPU 命令集。 命令佇列可用來提交要執行的命令清單。 此模型可讓開發人員更充分掌控圖形處理器 (GPU) 和 CPU 的有效使用方式。
命令佇列概觀
Direct3D 12 命令佇列會取代立即模式工作提交的運行時間和驅動程式同步處理,先前未公開給開發人員,而 API 可用來明確管理並行、平行處理原則和同步處理。 命令隊列為開發人員提供下列改善:
- 可讓開發人員避免由於意外同步而造成的效率缺失。
- 可讓開發人員在較高層級引進同步處理,以便更有效率且準確地判斷所需的同步處理。 這表示運行時間和圖形驅動程式會花費較少的時間,以回應方式設計平行處理原則。
- 讓昂貴的作業更加明確。
這些改進可啟用或增強下列情境:
- 提升平行處理能力 - 當應用程式有專用的佇列來處理前景工作時,可以使用更深層的佇列來處理背景工作負載,例如視頻解碼。
- 異步和低優先順序 GPU 工作 - 命令佇列模型可同時執行低優先順序 GPU 工作和原子操作,允許一個 GPU 線程不會被封鎖地取用另一個未同步線程的結果。
- 高優先順序計算工作 - 此設計可讓需要中斷 3D 轉譯的案例執行少量的高優先順序計算工作,以便提早取得結果,以便在 CPU 上進行額外的處理。
初始化命令佇列
您可以呼叫 ID3D12Device::CreateCommandQueue來建立命令佇列。 這個方法會採用 D3D12_COMMAND_LIST_TYPE,指出應該建立哪種類型的佇列,因此可以將何種類型的命令提交至該佇列。 請記住,套件組合只能從直接命令清單呼叫,而且無法直接提交至佇列。 支援的佇列類型如下:
一般而言,DIRECT 佇列和命令清單接受任何命令、COMPUTE 佇列和命令清單接受計算和複製相關命令,而 COPY 佇列和命令清單只接受複製命令。
執行命令清單
記錄命令清單並擷取預設命令佇列或建立新的命令佇列之後,您可以呼叫 ID3D12CommandQueue::ExecuteCommandLists來執行命令列表。
應用程式可以將命令清單提交至多個線程的任何命令佇列。 運行時間會依照提交順序執行串行化這些要求的工作。
執行時會驗證提交的命令清單,並在違反任何限制時取消對 ExecuteCommandLists 的呼叫。 呼叫將會因為下列原因而中斷:
- 提供的命令清單是套件組合,而不是直接命令清單。
- ID3D12GraphicsCommandList::Close 尚未在提供的命令清單中呼叫以完成錄製。
- ID3D12CommandAllocator::Reset 自記錄以來,已在與命令清單相關聯的命令配置器上呼叫。 如需命令設定器的詳細資訊,請參閱 建立和錄製命令清單和套件組合。
- 命令佇列欄杆表示先前執行的命令清單尚未完成。 下面詳細討論指令隊列柵欄。
- 查詢之前和之後的狀態,以呼叫 ID3D12GraphicsCommandList::BeginQuery 和 ID3D12GraphicsCommandList::EndQuery設定,則不相符。
- 資源轉換屏障前後的狀態未正確比對。 如需詳細資訊,請參閱 使用資源屏障同步處理資源狀態。
從多個命令佇列存取資源
運行時間會強加幾個規則,以限制從多個命令佇列存取資源。 這些規則如下所示:
無法同時從多個命令佇列寫入資源。 當資源已轉換至佇列上的可寫入狀態時,該佇列會將其視為獨佔擁有,且必須先轉換為讀取或 COMMON 狀態(請參閱 D3D12_RESOURCE_STATES),才能由另一個佇列存取。
當處於讀取狀態時,資源可以同時從多個命令佇列讀取,包括跨進程,這些都是基於其讀取狀態。
如需資源存取限制和使用資源屏障同步處理資源存取的詳細資訊,請參閱 使用資源屏障同步處理資源狀態。
使用命令佇列柵欄同步執行命令清單
Direct3D 12 中多個平行命令佇列的支援可讓您更彈性地控制 GPU 上的異步工作優先順序。 此設計也表示應用程式必須清楚地管理工作同步,特別是當某個佇列中的命令清單依賴於另一個命令佇列正在操作的資源時。 其中一些範例包括等候計算佇列上的作業完成,讓結果可用於 3D 佇列上的轉譯作業,以及等候 3D 作業完成,讓計算佇列上的作業可以存取要寫入的資源。 為了在佇列之間啟用工作同步處理,Direct3D 12 會使用圍欄的概念,此概念是由 ID3D12Fence 介面在 API 中表示。
柵欄是一個整數,表示正在處理的工作單位。 當應用程式前進圍欄時,呼叫 ID3D12CommandQueue::Signal,就會更新整數。 應用程式可以檢查柵欄的值,並判斷是否已完成工作單位,以決定是否可以啟動後續作業。
命令佇列存取的資源同步化
在 Direct3D 12 中,會使用資源屏障來同步處理某些資源的狀態。 在每個資源屏障上,應用程式會宣告資源的前後狀態。 常見的範例是讓資源從著色器資源檢視轉換為轉譯目標檢視。 在大多數情況下,這些資源屏障是在命令清單中管理。 啟用偵錯層時,系統會強制檢查所有資源在操作前後的狀態是否匹配,確保在障礙轉換期間資源處於特定操作的正確狀態。
如需同步處理資源狀態的詳細資訊,請參閱 使用資源屏障同步處理資源狀態。
拼貼資源的命令佇列支援
管理透過 Direct3D 11 ID3D11DeviceContext2 介面公開的並排資源的方法,是由 Direct3D 12 中的 ID3D12CommandQueue 介面所提供。 這些方法包括:
方法 | 描述 |
---|---|
CopyTileMappings | 將來源磁磚資源的映射複製到目的地磁磚資源。 |
UpdateTileMappings | 更新磁磚資源中磁磚位置與資源堆中記憶體位置的對應。 |
如需在 Direct3D 12 應用程式中使用磚資源的詳細資訊,請參閱 Direct3D11 磚資源。
相關主題
-
Direct3D 12 中的 工作提交