ID3D12CommandQueue::ExecuteCommandLists メソッド (d3d12.h)
実行するコマンド リストの配列を送信します。
構文
void ExecuteCommandLists(
[in] UINT NumCommandLists,
[in] ID3D12CommandList * const *ppCommandLists
);
パラメーター
[in] NumCommandLists
実行するコマンド リストの数。
[in] ppCommandLists
実行する ID3D12CommandList コマンド リストの配列。
戻り値
なし
解説
ExecuteCommandLists を (同じスレッドまたは異なるスレッドから) 連続して 2 回呼び出すと、最初のワークロード (A) が 2 番目のワークロード (B) の前に完了することを保証します。 2 つのコマンド リストで ExecuteCommandLists を呼び出すと、ドライバーは 2 つのコマンド リストをマージして、2 番目のコマンド リスト (D) が最初の (C) のすべての作業が完了する前に作業の実行を開始できます。 具体的には、アプリケーションでフェンス信号を挿入したり、A と B の間で待機したりすることが許可されており、ドライバーはこれに対する可視性を持たないため、ドライバーはフェンス操作の前に A 内のすべてのものが完了していることを確認する必要があります。 API を 1 回呼び出してもこのような機会がないため、ドライバーはそのシナリオを最適化できます。
ドライバーは、送信されたコマンド リストに自由に修正プログラムを適用できます。 グラフィックス処理装置 (GPU) が、以前の実行から送信されたコマンド リストを現在読み取らないようにするのは、呼び出し元アプリケーションの責任です。
アプリケーションでは、GPU に送信されたコマンドに関連する固定コストを削減するために、コマンド リストの実行をバッチ処理することをお勧めします。
ランタイム検証
バンドルをコマンド キューに直接送信することはできません。 バンドルがこのメソッドに渡されると、ランタイムは呼び出しを削除します。 また、1 つ以上のコマンド リストで Close 関数が呼び出されていない場合、ランタイムは呼び出しを削除します。
ランタイムは、 Close が呼び出された後に、コマンド リストに関連付けられているコマンド アロケーターがリセットされたかどうかを検出します。 ランタイムは、この状況で呼び出しを削除し、デバイスを削除します。
コマンド キュー フェンスがいずれかのコマンド リストの以前の実行がまだ完了していないと示されている場合、ランタイムは呼び出しを削除し、デバイスを削除します。
ランタイムは、 ExecuteCommandLists 内のリソース遷移バリアの "before" 状態と "after" 状態を検証します。 遷移の "before" 状態が以前の遷移の "after" 状態と一致しない場合、ランタイムは呼び出しを削除し、デバイスを削除します。
ランタイムは、コマンド リストによって使用されるクエリの "before" 状態と "after" 状態を検証します。 エラーが検出された場合、ランタイムは呼び出しを削除し、デバイスを削除します。
デバッグ レイヤー
デバッグ レイヤーは、ランタイムが呼び出しを削除するすべてのケースに対してエラーを発行します。
コマンド リストによって参照されているリソース (クエリを含む) が破棄されたことを検出すると、デバッグ レイヤーはエラーを発行します。
例
シーンをレンダリングします。
// 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();
}
要件
対象プラットフォーム | Windows |
ヘッダー | d3d12.h |