ID3D12CommandQueue::ExecuteCommandLists 方法 (d3d12.h)

提交要執行的命令清單陣列。

語法

void ExecuteCommandLists(
  [in] UINT              NumCommandLists,
  [in] ID3D12CommandList * const *ppCommandLists
);

參數

[in] NumCommandLists

要執行的命令清單數目。

[in] ppCommandLists

要執行的 ID3D12CommandList 命令清單陣列。

傳回值

備註

從相同執行緒連續 (呼叫 ExecuteCommandLists 兩次,或) 會保證第一個工作負載 (A) 在第二個工作負載 (B) 之前完成。 使用個命令清單呼叫ExecuteCommandLists可讓驅動程式合併兩個命令清單,讓第二個命令清單 (D) 可能會在從第一個 (C) 完成所有工作之前開始執行工作。 具體來說,您的應用程式允許在 A 和 B 之間插入柵欄訊號或等候,而驅動程式無法看見此情況,因此驅動程式必須確定 A 中的所有內容都已完成,才能進行柵欄作業。 在對 API 的單一呼叫中沒有這類機會,因此驅動程式能夠優化該案例。

驅動程式可以免費修補提交的命令清單。 呼叫端應用程式必須負責確保圖形處理單位 (GPU) 目前並未從先前執行讀取任何提交的命令清單。

建議應用程式將命令清單執行批次處理,以減少與提交命令至 GPU 相關聯的固定成本。

執行階段驗證

套件組合無法直接提交至命令佇列。 如果套件組合傳遞至這個方法,執行時間將會卸載呼叫。 如果一或多個命令清單上尚未呼叫 Close 函式,執行時間也會卸載呼叫。

執行時間會在呼叫 Close 之後,偵測是否已重設與命令清單相關聯的命令配置器。 執行時間將會卸載呼叫,並在此情況下移除裝置。

如果命令佇列柵欄指出任何命令清單先前的執行尚未完成,執行時間將會卸載呼叫並移除裝置。

執行時間會驗證 ExecuteCommandLists內資源轉換屏障的「之前」和「之後」狀態。 如果轉換的「之前」狀態與先前轉換的「之後」狀態不相符,則執行時間會卸載呼叫並移除裝置。

執行時間會驗證命令清單所使用之查詢的「之前」和「之後」狀態。 如果偵測到錯誤,執行時間將會卸載呼叫並移除裝置。

偵錯層

偵錯層會針對執行時間卸載呼叫的所有案例發出錯誤。

如果偵錯層偵測到命令清單所參考的任何資源,包括查詢已終結,就會發出錯誤。

範例

轉譯場景。

// Pipeline objects.
D3D12_VIEWPORT m_viewport;
ComPtr<IDXGISwapChain3> m_swapChain;
ComPtr<ID3D11DeviceContext> m_d3d11DeviceContext;
ComPtr<ID3D11On12Device> m_d3d11On12Device;
ComPtr<ID3D12Device> m_d3d12Device;
ComPtr<IDWriteFactory> m_dWriteFactory;
ComPtr<ID2D1Factory3> m_d2dFactory;
ComPtr<ID2D1Device2> m_d2dDevice;
ComPtr<ID2D1DeviceContext2> m_d2dDeviceContext;
ComPtr<ID3D12Resource> m_renderTargets[FrameCount];
ComPtr<ID3D11Resource> m_wrappedBackBuffers[FrameCount];
ComPtr<ID2D1Bitmap1> m_d2dRenderTargets[FrameCount];
ComPtr<ID3D12CommandAllocator> m_commandAllocators[FrameCount];
ComPtr<ID3D12CommandQueue> m_commandQueue;
ComPtr<ID3D12RootSignature> m_rootSignature;
ComPtr<ID3D12DescriptorHeap> m_rtvHeap;
ComPtr<ID3D12PipelineState> m_pipelineState;
ComPtr<ID3D12GraphicsCommandList> m_commandList;
D3D12_RECT m_scissorRect;
// Render the scene.
void D3D1211on12::OnRender()
{
    // Record all the commands we need to render the scene into the command list.
    PopulateCommandList();

    // Execute the command list.
    ID3D12CommandList* ppCommandLists[] = { m_commandList.Get() };
    m_commandQueue->ExecuteCommandLists(_countof(ppCommandLists), ppCommandLists);

    RenderUI();

    // Present the frame.
    ThrowIfFailed(m_swapChain->Present(1, 0));

    MoveToNextFrame();
}

請參閱 D3D12 參考中的範例程式碼

需求

   
目標平台 Windows
標頭 d3d12.h

另請參閱

ID3D12CommandQueue