次の方法で共有


Direct3D 11 on 12

D3D11On12 は、開発者が D3D11 インターフェイスとオブジェクトを使用して D3D12 API を駆動できるメカニズムです。 D3D11on12 を使用すると、D3D11 を使用して作成されたコンポーネント (D2D テキストや UI など) を、D3D12 API を対象として作成されたコンポーネントと連携できます。 また、D3D11on12 では、アプリケーションの D3D11 から D3D12 への増分移植も可能になります。これにより、アプリの一部は D3D11 を引き続きターゲットにし、他のユーザーはパフォーマンスのために D3D12 をターゲットにし、常に完全で正しいレンダリングを行うことができます。 D3D11On12 を使用すると、相互運用手法を使用してリソースを共有し、2 つの API 間で作業を同期するよりも簡単になります。

D3D11On12 の初期化

D3D11On12 の使用を開始するには、まず D3D12 デバイスとコマンド キューを作成します。 これらのオブジェクトは、D3D11On12CreateDevice初期化メソッドへの入力として提供されます。 このメソッドは、D3D11 ドライバーがオブジェクトの作成と D3D12 API へのコマンド リストの送信を担当する、架空のドライバーの種類D3D_DRIVER_TYPE_11ON12を持つ D3D11 デバイスを作成する方法と考えることができます。

D3D11 デバイスと即時コンテキストを取得したら、ID3D11On12Device インターフェイスのデバイスを QueryInterface できます。 これは、D3D11 と D3D12 の間の相互運用に使用される主要なインターフェイスです。 D3D11 デバイス コンテキストと D3D12 コマンド リストの両方を同じリソースで動作させるには、CreateWrappedResource API を使用して "ラップされたリソース" を作成する必要があります。 このメソッドは、D3D11 で理解できるように D3D12 リソースを "昇格" します。 ラップされたリソースは、AcquireWrappedResources および ReleaseWrappedResources メソッドによって操作されるプロパティである "取得済み" 状態で開始されます。

使用例

D3D11On12 の一般的な使用方法は、D2D を使用して D3D12 バック バッファーの上にテキストまたは画像をレンダリングすることです。 コード例については、D3D11On12 サンプルを参照してください。 これを行う手順の大まかな概要を次に示します。

  • D3D12 デバイス (D3D12CreateDevice) と D3D12 スワップ チェーン (ID3D12CommandQueue を入力としてCreateSwapChain) を作成します。
  • D3D12 デバイスと入力と同じコマンド キューを使用して、D3D11On12 デバイスを作成します。
  • スワップ チェーン バック バッファーを取得し、それぞれの D3D11 ラップされたリソースを作成します。 使用される入力状態は、D3D12 が最後に使用した方法 (例: RENDER_TARGET) で、出力状態は D3D11 が終了した後に D3D12 が使用する方法 (PRESENT など) である必要があります。
  • D2D を初期化し、D3D11 でラップされたリソースを D2D に提供して、レンダリングの準備をします。

次に、各フレームで次の操作を行います。

  • D3D12 コマンド リストを使用して現在のスワップ チェーン バック バッファーにレンダリングし、それを実行します。
  • 現在のバック バッファーのラップされたリソース (AcquireWrappedResources) を取得します。
  • D2D レンダリング コマンドを発行します。
  • ラップされたリソース (ReleaseWrappedResources) を解放します。
  • D3D11 即時コンテキストをフラッシュします。
  • Present (IDXGISwapChain1::P resent1)。

バックグラウンド

D3D11On12 は体系的に動作します。 各 D3D11 API 呼び出しでは、一般的なランタイム検証が行われ、ドライバーに移動します。 ドライバー レイヤーでは、特殊な 11on12 ドライバーが状態を記録し、D3D12 コマンド リストにレンダリング操作を発行します。 これらのコマンド リストは、必要に応じて送信されます (たとえば、クエリ GetData やリソース Map では、コマンドをフラッシュする必要があります)、または Flush によって要求されます。 通常、D3D11 オブジェクトを作成すると、対応する D3D12 オブジェクトが作成されます。 GenerateMipsDrawAuto など、D3D11 の一部の固定関数レンダリング操作は D3D12 ではサポートされていないため、D3D11On12 はシェーダーと追加のリソースを使用してそれらをエミュレートします。

相互運用のためには、D3D11On12 がアプリによって作成および提供された D3D12 オブジェクトとどのように対話するかを理解することが重要です。 作業が正しい順序で行われるようにするには、追加の D3D12 作業をそのキューに送信する前に、D3D11 即時コンテキストをフラッシュする必要があります。 また、D3D11On12 に指定されたキューを常にドレイン可能にする必要があることを確認することも重要です。 つまり、D3D11 レンダー スレッドが無期限にブロックされた場合でも、キューの待機は最終的に満たす必要があります。 今後のリリースで変更される可能性があるため、D3D11On12 がフラッシュまたは待機を挿入するタイミングに依存しないように注意してください。 さらに、D3D11On12 はリソースの状態を単独で追跡および操作します。 状態遷移の一貫性を確保する唯一の方法は、取得/リリース API を使用して、アプリのニーズに合わせて状態追跡を操作することです。

クリーンアップ

D3D11On12 でラップされたリソースを解放するには、次の 2 つの状況が発生する必要があります。

  • リソースへのすべての参照 (リソースのビューを含む) を解放する必要があります。
  • 遅延破棄処理を実行する必要があります。 これを確実に行う最も簡単な方法は、API Flush 即時コンテキストを呼び出す方法です。

これらの手順の両方が完了すると、ラップされたリソースによって実行されるすべての参照が解放され、D3D12 リソースが D3D12 コンポーネントによって排他的に所有されるようになります。 D3D12 では、リソースを完全に解放する前に GPU の完了を待つ必要があることに注意してください。そのため、GPU がリソースを使用していないことを既に確認していない限り、上記の 2 つの手順を実行する前に、必ずリソースの参照を保持してください。

D3D11On12 によって作成されたその他のすべてのリソースまたはオブジェクトは、GPU での使用が終了したときに、D3D11 の遅延破棄メカニズムを使用して適切なタイミングでクリーンアップされます。 ただし、GPU の実行中に D3D11On12 デバイス自体を解放しようとすると、GPU が完了するまで破棄がブロックされる可能性があります。

制限

D3D11On12 レイヤーは D3D11 API の非常に大きなサブセットを実装しますが、(不適切なレンダリングを引き起こす可能性がある実装のバグに加えて) いくつかの既知のギャップがあります。

Windows 10 バージョン 1809 (10.0;ビルド 17763) は、シェーダー モデル 6.0 以降をサポートするドライバーで D3D11On12 が実行されている限り、インターフェイスを使用するシェーダーを実行できます。 以前のバージョンの Windows では、シェーダー インターフェイス機能は D3D11On12 に実装されていないため、この機能を使用しようとするとエラーが発生し、メッセージがデバッグされます。

Windows 10 バージョン 1803 (10.0;ビルド 17134)、スワップ チェーンは D3D11On12 デバイスでサポートされています。 以前のバージョンの Windows では、それ以外のバージョンではありません。

D3D11On12 はパフォーマンス用に最適化されていません。 標準的な D3D11 ドライバーと比較すると、CPU オーバーヘッドが中程度になり、GPU のオーバーヘッドが最小限に抑えられる可能性があり、メモリオーバーヘッドが大幅に増加することがわかっています。 したがって、複雑な 3D シーンには D3D11On12 を使用することはお勧めしません。代わりに、単純なシーンや 2D レンダリングに使用することをお勧めします。

API

11on12 レイヤーを構成する API については、11on12 リファレンスで説明されています。

D3D11on12 チュートリアル を使用した D2D の

Direct3D 12 について

Direct3D 11、Direct3D 10、および Direct2D の操作