Direct3D 11 のデバイスの概要

Direct3D 11 のオブジェクト モデルでは、リソースの作成機能とレンダリング機能をデバイスと 1 つ以上のコンテキストに分離しています。この分離はマルチスレッドの容易化を目的としています。

  • デバイス
  • デバイス コンテキスト
  • スレッドの考慮事項

デバイス

デバイスは、リソースの作成およびディスプレイ アダプターの機能の列挙に使用します。Direct3D 11 では、デバイスは ID3D11Device インターフェイスで表現します。

各アプリケーションには 1 つ以上のデバイスが必要ですが、ほとんどのアプリケーションでは、作成するデバイスは 1 つのみです。D3D11CreateDevice または D3D11CreateDeviceAndSwapChain を呼び出して、コンピューターにインストールされているいずれかのハードウェア ドライバーのデバイスを作成し、D3D_DRIVER_TYPE フラグでそのドライバーの種類を指定します。各デバイスでは、必要な機能に応じて 1 つ以上のデバイス コンテキストを使用できます。

デバイス コンテキスト

デバイス コンテキストには、デバイス使用時の環境や設定を格納します。具体的には、パイプライン ステートを設定し、デバイスが所有するリソースを使用してレンダリング コマンドを生成するためにデバイス コンテキストを使用します。Direct3D 11 では、イミディエイト レンダリング用とディファード レンダリング用の 2 種類のデバイス コンテキストが実装されます。どちらのコンテキストも ID3D11DeviceContext インターフェイスで表現します。

イミディエイト コンテキスト

イミディエイト コンテキストでは、ドライバーに直接レンダリングします。各デバイスは、GPU からデータを取得できるイミディエイト コンテキストを 1 つだけ持ちます。イミディエイト コンテキストを使用すると、コマンド リストを直ちにレンダリング (または再生) できます。

イミディエイト コンテキストの取得方法には、次の 2 つがあります。

ディファード コンテキスト

ディファード コンテキストでは、GPU コマンドをコマンド リストに記録します。ディファード コンテキストは主にマルチスレッドで使用するので、シングル スレッド アプリケーションでは不要です。ディファード コンテキストは、通常、メインのレンダリング スレッドではなく、ワーカー スレッドで使用します。ディファード コンテキストは、その作成時にイミディエイト コンテキストのどのステートも継承しません。

ディファード コンテキストを取得するには、ID3D11Device::CreateDeferredContext を呼び出します。

イミディエイト コンテキストもディファード コンテキストも、あらゆるスレッドで使用できますが、これらのコンテキストを使用できるスレッドは一度に 1 つのみです。

スレッドの考慮事項

次の表は、Direct3D 11 と以前のバージョンの Direct3D でのスレッド モデルの相違を示しています。

Direct3D 11 と以前のバージョンの Direct3D との相違

ID3D11Device インターフェイスのメソッドはすべてフリー スレッド化されているので、一度に複数のスレッドから関数を呼び出しても安全です。

  • ID3D11DeviceChild の派生インターフェイス (ID3D11BufferID3D11Query など) はすべてフリー スレッド化されています。
  • Direct3D 11 では、リソースの作成とレンダリングが 2 つのインターフェイスに分割されています。ID3D11Device では、処理の順序を厳格に定義できるので、Map、Unmap、Begin、End、および GetData は ID3D11DeviceContext 上で実装されます。ID3D11Resource インターフェイスおよび ID3D11Asynchronous インターフェイスでも、フリー スレッド化した処理に使用するメソッドが実装されます。
  • ID3D11DeviceContext のメソッド (ID3D11DeviceChild 上のものを除く) はフリー スレッド化されていないため、シングル スレッドで使用する必要があります。そのメソッド (Draw、Copy、Map など) を安全に呼び出せるスレッドは、一度に 1 つのみです。
  • 通常、フリー スレッド化によって、使用する同期プリミティブの数とその持続時間を削減できます。ただし、持続時間が長い同期を使用するアプリケーションが存在すると、アプリケーションで予測できる可能な同時実行数が直接影響を受けることがあります。

ID3D10Device インターフェイスの各メソッドは、フリー スレッド化するように設計されていません。ID3D10Device では、作成とレンダリングのすべての機能が実装されます (Direct3D 9 の ID3D9Device と同様)。Map と Unmap は ID3D10Resource の派生インターフェイス上で実装され、Begin、End、および GetData は ID3D10Asynchronous の派生インターフェイス上で実装されます。

関連項目

デバイス