次の方法で共有


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();
}

「D3D12 リファレンス」のコード例を参照してください

要件

   
対象プラットフォーム Windows
ヘッダー d3d12.h

関連項目

ID3D12CommandQueue