IDMLCommandRecorder::RecordDispatch 方法 (directml.h)
記錄在運算子初始化表達式 (執行可分派物件,或將編譯的運算子) 到命令清單。
此方法不會將執行提交至 GPU;它只會將它記錄到命令清單中。 您必須負責關閉命令清單,並將它提交至 Direct3D 12 命令佇列。
在 GPU 上執行此呼叫之前,系結的所有資源都必須處於 D3D12_RESOURCE_STATE_UNORDERED_ACCESS 狀態,或隱含提升至 D3D12_RESOURCE_STATE_UNORDERED_ACCESS的狀態,例如 D3D12_RESOURCE_STATE_COMMON。 此呼叫完成之後,資源會維持在 D3D12_RESOURCE_STATE_UNORDERED_ACCESS 狀態。 唯一的例外是在執行運算元初始化表達式時,以及一或多個張量具有 DML_TENSOR_FLAG_OWNED_BY_DML 旗標集時系結的上傳堆積。 在此情況下,系結輸入的任何上傳堆積都必須處於 D3D12_RESOURCE_STATE_GENERIC_READ 狀態,而且會保持該狀態,因為所有上傳堆積都需要。
這個方法會在命令清單上重設下列狀態。
- 計算根簽章
- 管線狀態
雖然這個方法會採用系結數據表來表示系結至管線的資源,但它不會設定包含描述元本身的描述項堆積。 因此,您的應用程式負責呼叫 ID3D12GraphicsCommandList::SetDescriptorHeaps ,以將正確的描述元堆積系結至管線。
如果在編譯運算符時未設定 DML_EXECUTION_FLAG_DESCRIPTORS_VOLATILE ,則在呼叫 RecordDispatch 之前,必須先在系結數據表上設定所有系結,否則行為未定義。 否則,如果已設定 _DESCRIPTORS_VOLATILE 旗標,則資源系結可能會延遲,直到 Direct3D 12 命令清單提交至命令佇列以供執行為止。
這個方法在邏輯上就像呼叫 ID3D12GraphicsCommandList::D ispatch 一樣。 因此,非排序的存取檢視 (UAV) 屏障是必要的,以確保分派之間是否有數據相依性的正確順序。 此方法不會在輸入或輸出資源上插入UAV屏障。 如果您的應用程式必須確定如果其內容相依於上游分派,且下游分派相依於這些輸出,則必須在任何輸入上執行正確的 UAV 屏障。
這個方法不會保存傳入之任何介面的參考。 您必須負責確保 IDMLDispatchable 物件在 GPU 上完成執行之前,不會釋放所有分派。
語法
void RecordDispatch(
ID3D12CommandList *commandList,
IDMLDispatchable *dispatchable,
IDMLBindingTable *bindings
);
參數
commandList
類型: ID3D12CommandList*
ID3D12CommandList 介面的指標,表示要記錄執行的命令清單。 命令清單必須開啟,而且必須具有類型 D3D12_COMMAND_LIST_TYPE_DIRECT 或 D3D12_COMMAND_LIST_TYPE_COMPUTE。
dispatchable
類型: IDMLDispatchable*
IDMLDispatchable 介面的指標,代表運算元初始化表達式 (物件,或執行將會記錄到命令清單中的編譯運算符) 。
bindings
類型: IDMLBindingTable*
IDMLBindingTable 介面的指標,表示用來執行可發送對象的系結。 如果未設定 DML_EXECUTION_FLAG_DESCRIPTORS_VOLATILE 旗標,則您必須填寫所有必要的系結,否則會產生錯誤。
傳回值
無
規格需求
需求 | 值 |
---|---|
目標平台 | Windows |
標頭 | directml.h |
程式庫 | DirectML.lib |
Dll | DirectML.dll |