Direct3D 11 のデバイスの概要
Direct3D 11 オブジェクト モデルは、リソースの作成とレンダリング機能をデバイスと 1 つ以上のコンテキストに分離します。この分離は、マルチスレッドを容易にするように設計されています。
Device
デバイスは、リソースを作成し、ディスプレイ アダプターの機能を列挙するために使用されます。 Direct3D 11 では、デバイスは ID3D11Device インターフェイスで表されます。
各アプリケーションには少なくとも 1 つのデバイスが必要であり、ほとんどのアプリケーションは 1 つだけデバイスを作成します。 D3D11CreateDevice または D3D11CreateDeviceAndSwapChain を呼び出して、コンピューターにインストールされているハードウェア ドライバーの 1 つ用のデバイスを作成し、ドライバーの種類を D3D_DRIVER_TYPE フラグで指定します。 各デバイスでは、必要な機能に応じて、1 つまたは複数のデバイス コンテキストを使用できます。
デバイス コンテキスト
デバイス コンテキストには、デバイスが使用される状況または設定が含まれます。 具体的には、デバイス コンテキストを使用して、パイプラインの状態を設定し、デバイスが所有するリソースを使用してレンダリング コマンドを生成します。 Direct3D 11 には、即時レンダリング用と遅延レンダリング用の 2 種類のデバイス コンテキストが実装されています。どちらのコンテキストも ID3D11DeviceContext インターフェイスで表されます。
イミディエイト コンテキスト
イミディエイト コンテキストは、ドライバーに直接レンダリングされます。 各デバイスには、GPU からデータを取得できる 1 つだけの即時コンテキストがあります。 イミディエイト コンテキストを使用して、 コマンド リストをすぐにレンダリング (または再生) できます。
すぐにコンテキストを取得するには、次の 2 つの方法があります。
- D3D11CreateDevice または D3D11CreateDeviceAndSwapChain を呼び出します。
- ID3D11Device::GetImmediateContext を呼び出す。
遅延コンテキスト
遅延コンテキストは、GPU コマンドを コマンド リストに記録します。 遅延コンテキストは主にマルチスレッドに使用され、シングルスレッド アプリケーションでは必要ありません。 遅延コンテキストは、通常、メインレンダリング スレッドではなくワーカー スレッドによって使用されます。 遅延コンテキストを作成しても、イミディエイト コンテキストから状態は継承されません。
遅延コンテキストを取得するには、 ID3D11Device::CreateDeferredContext を呼び出します。
コンテキストが一度に 1 つのスレッドでのみ使用されている限り、任意のコンテキスト (即時または遅延) を任意のスレッドで使用できます。
スレッドの考慮事項
次の表では、Direct3D 11 のスレッド モデルと以前のバージョンの Direct3D の違いを示します。
Direct3D 11 と以前のバージョンの Direct3D の違い:
すべての ID3D11Device インターフェイス メソッドはフリー スレッドであるため、複数のスレッドで同時に関数を呼び出しても安全です。
- すべての ID3D11DeviceChild 派生インターフェイス (ID3D11Buffer、ID3D11Query など) はフリー スレッドです。
- Direct3D 11 では、リソースの作成とレンダリングが 2 つのインターフェイスに分割されます。 MAP、Unmap、Begin、End、GetData は ID3D11DeviceContext に実装されます。 ID3D11Device は 操作の順序を厳密に定義するためです。 ID3D11Resource および ID3D11Asynchronous インターフェイスは、フリースレッド操作のメソッドも実装します。
- ID3D11DeviceContext メソッド (ID3D11DeviceChild に存在するものを除く) はフリースレッドではありません。つまり、単一スレッド化が必要です。 一度に任意のメソッド (Draw、Copy、Map など) を呼び出すことのできるスレッドは 1 つだけです。
- 一般に、フリー スレッド化では、使用される同期プリミティブの数とその期間が最小限に抑えられます。 ただし、長時間保持されている同期を使用するアプリケーションは、アプリケーションが実現できるコンカレンシーの量に直接影響する可能性があります。